Logcat — 정의, 로깅 레벨 및 로그 작업

저자: IT Sectr 게시일: 2026-05-06 읽는 시간: 8 분

Logcat은 ADB 또는 Android Studio의 내장 콘솔을 통해 사용할 수 있는, 실시간으로 시스템 메시지와 애플리케이션 로그를 보기 위한 Android SDK 도구입니다. Android Developers에 따르면 Logcat은 시스템의 모든 프로세스에서 메시지를 수집하고, 중요도 레벨과 태그별로 필터링하며, 개발자가 오류를 진단하고 코드 실행을 추적하며 성능을 분석할 수 있게 합니다. Logcat은 Android 애플리케이션을 디버깅할 때 주요 정보 소스입니다.

주요 포인트

  • Logcat — Android Studio의 콘솔 창으로 Android 시스템 로그를 실시간으로 확인
  • 로그 레벨 — VERBOSE, DEBUG, INFO, WARN, ERROR, ASSERT — 메시지 중요도와 필터링 임계값 결정
  • 필터링은 태그, 레벨, 키워드로 특정 애플리케이션의 로그를 일반 스트림에서 분리 가능
  • ADB logcat — Android Studio 없이 USB 또는 Wi-Fi를 통해 로그에 접근하는 터미널 명령어
  • 크래시 로그 — 스택 트레이스가 있는 예외가 자동으로 Logcat에 전달되며 전체 크래시 진단 정보 포함

Android에서 Logcat이란

Logcat은 모든 프로세스(Linux 커널, system_server 및 애플리케이션 포함)가 특정 형식으로 메시지를 쓰는 Android 시스템 버퍼입니다. Android SDK에 포함된 logcat 도구는 이 버퍼를 읽고 실시간으로 메시지를 표시합니다. Android 4.1(API 16)부터 Logcat 접근이 제한됩니다: 애플리케이션은 자신의 로그만 읽을 수 있으며, 시스템 로그는 디버그 액세스가 있는 ADB를 통해 접근 가능합니다.

Logcat 메시지에는 다섯 개의 필드가 있습니다: 날짜와 시간, PID(프로세스 식별자), TID(스레드 식별자), 로그 레벨 및 태그입니다. 형식은 고정되어 있으며 모든 Android 버전에서 동일합니다. 이를 통해 IDE에 의존하지 않고 CI/CD 파이프라인에서 로그 필터링에 grep, awk 및 sed 유틸리티를 사용할 수 있습니다.

로그는 고정 크기의 링 버퍼에 저장됩니다: main용 256KB, system용 256KB, events용 256KB(Android 5+). 버퍼가 오버플로우되면 이전 메시지가 삭제됩니다. 개발자는 PROP logcat.size 속성이나 기기의 개발자 옵션에서 버퍼 크기를 변경할 수 있습니다.

로그 레벨과 태그: Logcat 메시지 구조

6가지 레벨의 로깅이 메시지의 중요도를 결정합니다. Android는 다른 플랫폼과 유사한 표준 레벨을 사용하지만 Log 클래스에 자체 상수 이름을 가지고 있습니다. 올바른 레벨을 선택하면 로그를 효율적으로 필터링하고 중요한 메시지가 보조 메시지에 묻히는 것을 방지할 수 있습니다.

레벨상수목적기본 표시
VERBOSELog.v최대한 상세한 디버그 정보아니요
DEBUGLog.d개발자용 디버그 메시지아니요
INFOLog.i애플리케이션 작동에 대한 정보 메시지
WARNLog.w잠재적 문제에 대한 경고
ERRORLog.e심각한 오류 및 예외
ASSERTLog.wtf원칙적으로 발생해서는 안 되는 오류

태그: 모듈별 메시지 구성

태그(tag)는 메시지 소스를 식별하는 최대 23자의 문자열입니다. 태그로 클래스 또는 모듈 이름을 사용하는 것이 좋습니다: MainActivity, AuthManager, NetworkModule. 이를 통해 애플리케이션의 특정 구성 요소별로 로그를 필터링할 수 있습니다. 팀 내 일관성을 위해 별도 파일에 태그 상수를 만들거나 클래스 이름을 기반으로 자동으로 태그를 삽입하는 Timber 라이브러리를 사용할 수 있습니다.

크래시 로그 및 예외 스택 트레이스

처리되지 않은 예외가 발생하면 Android가 자동으로 Logcat에 전체 스택 트레이스를 기록하며, 클래스, 메서드, 코드 라인 및 호출 체인을 표시합니다. 크래시 로그에는 예외 유형(NullPointerException, RuntimeException), 메시지 및 크래시 지점에서 애플리케이션의 진입점까지의 호출 시퀀스가 포함됩니다. 사용자 기기의 크래시 로그 분석에는 Firebase Crashlytics가 사용되며, 난독화 맵(Android용 mapping.txt)과 스택 트레이스를 동기화합니다.

Android Studio의 Logcat: 인터페이스, 필터 및 검색

Android Studio는 View → Tool Windows → Logcat(Alt + 6)을 통해 접근 가능한 그래픽 Logcat 인터페이스를 제공합니다. Logcat 창은 실시간으로 업데이트되며, 연결된 기기의 모든 메시지를 표시하고 일반 스트림에서 원하는 정보를 분리하기 위한 유연한 필터를 구성할 수 있습니다.

레벨 및 태그별 필터링

Log Level 드롭다운은 최소 레벨별로 메시지를 필터링합니다: WARN을 선택하면 VERBOSE, DEBUG, INFO를 숨기고 경고와 오류만 표시합니다. 검색 필드는 메시지 텍스트 또는 태그로 검색할 수 있으며 — 정규식을 지원하여 패턴별 메시지 검색에 편리합니다.

저장된 필터

Saved Filters는 Android Studio에서 Logcat의 강력한 기능입니다. 애플리케이션의 태그(tag:MyApp)와 WARN+ 레벨의 메시지만 표시하는 필터를 만들 수 있습니다. 필터는 세션 간에 유지되며 드롭다운 목록에서 사용할 수 있습니다. 여러 모듈이 있는 프로젝트의 경우 각 모듈에 대해 별도의 필터를 만드세요.

text
# 애플리케이션 로그 필터링을 위한 표현식 예
tag:"MyApp" level:WARN # MyApp의 WARN+만
package:"com.mycompany" # 패키지의 모든 로그
-tag:"okhttp" # OkHttp 로그 제외

내보내기 및 분석

Logcat 로그는 Save to File 아이콘을 통해 텍스트 파일로 내보낼 수 있습니다. 이는 Jira의 티켓에 첨부하거나 긴 세션을 분석하는 데 유용합니다. 내보낸 로그는 모든 텍스트 편집기에서 열 수 있으며 grep을 적용하여 패턴을 검색할 수 있습니다. 형식화된 보기를 위해 logcat-color 유틸리티를 사용하세요.

ADB logcat: 고급 작업을 위한 터미널 명령어

ADB logcat은 Logcat의 콘솔 버전으로, Android Debug Bridge를 통해 접근 가능합니다. 주요 장점은 CI 서버, 자동화 스크립트 및 Android Studio가 없는 기기에서 실행할 수 있다는 것입니다. ADB logcat은 GUI와 동일한 모든 필터를 지원하지만 명령줄의 유연성을 제공합니다.

기본 명령어

adb logcat 명령어는 인수 없이 전체 버퍼를 실시간으로 출력합니다. 중지하려면 Ctrl+C를 사용하세요. -c 플래그는 기록 시작 전에 버퍼를 지웁니다 — 현재 테스트의 로그를 이전 메시지와 분리해야 할 때 편리합니다. -b 플래그는 버퍼 유형을 선택합니다: main, system, events, crash(Android 12+).

bash
# 버퍼를 지우고 MyApp 태그로 로그 기록 시작
adb logcat -c
adb logcat MyApp:D *:S

# 로그를 파일에 저장
adb logcat -d > logcat_dump.txt

# 프로세스 PID로 필터링
adb logcat --pid=12345

grep 및 awk를 사용한 필터링

ADB와 Unix 유틸리티의 조합은 최대의 유연성을 제공합니다. 예를 들어, 필터 "*:S TAG:D"는 TAG 태그가 있는 DEBUG 레벨 이상의 메시지만 표시하고 나머지는 모두 숨깁니다. 예외만 보려면 grep -i exception을 사용하세요. 오류 빈도를 분석하려면 태그 열에 sort | uniq -c를 적용하세요.

CI/CD에서의 Logcat

CI 서버에서는 UI 테스트 실행 중 진단 정보 수집에 Logcat이 사용됩니다. 일반적인 파이프라인: 테스트 실행 전에 버퍼를 지우고, 테스트 실행 후 로그 덤프를 빌드 아티팩트로 저장합니다. 테스트가 실패하면 로그를 통해 실패가 ANR, 처리되지 않은 예외 또는 네트워크 타임아웃으로 인한 것인지 확인할 수 있습니다.

코드에서 로깅: Log.d, Log.e 및 Timber

android.util.Log 클래스는 Logcat에 메시지를 쓰기 위한 내장 API입니다. Log.v, Log.d, Log.i, Log.w, Log.e 및 Log.wtf는 태그(문자열)와 메시지(문자열) 또는 메시지 + Throwable을 받습니다. 메시지 형식 지정에는 String.format 또는 Kotlin 문자열 템플릿을 사용하세요 — 힙에 불필요한 객체를 생성하는 문자열 연결은 피하세요.

Timber 라이브러리

Timber는 Jake Wharton의 인기 라이브러리로, 내장 Log API의 단점을 해결합니다. Timber는 로깅을 호출한 클래스 이름을 기반으로 자동으로 태그를 삽입하며, 매 호출마다 태그를 전달할 필요가 없습니다. Timber는 조건부 로깅도 지원합니다: Release 빌드에서 Timber.v 및 Timber.d 호출은 Application.onCreate에서 한 줄로 비활성화할 수 있습니다.

kotlin
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // 내장 Log API
        Log.d("MainActivity", "onCreate called")

        // Timber — 클래스 이름으로 자동 태그
        Timber.d("onCreate called")
    }

    private fun loadData() {
        try {
            val result = fetchFromNetwork()
            Timber.i("Data loaded: $result")
        } catch (e: IOException) {
            Timber.e(e, "Failed to load data")
        }
    }
}

Release를 위한 조건부 로깅

Release 빌드에서는 Logcat 버퍼 부하를 줄이고 민감한 정보 유출을 방지하기 위해 VERBOSE 및 DEBUG 로그를 비활성화하는 것이 좋습니다. Timber는 PlantingTree를 통해 이 문제를 해결합니다: Debug 플레이버에서는 DebugTree를 심고(모두 로깅), Release에서는 CrashReportingTree를 심습니다(Crashlytics를 통해 ERROR만 로깅). 내장 Log API는 조건부 로깅을 지원하지 않으므로 개발자는 각 호출을 if (BuildConfig.DEBUG)로 감싸야 합니다.

자주 묻는 질문

테스트 실행 전에 Logcat 버퍼를 지우는 방법

테스트 실행 전에 adb logcat -c 명령어를 사용하세요. 또는 Android Studio의 Logcat 창에서 Clear Logcat 버튼(휴지통)을 클릭하세요. 지우기는 다른 프로세스의 시스템 버퍼에 영향을 주지 않으며 현재 연결에만 영향을 줍니다.

Logcat 버퍼 크기를 늘리는 방법

버퍼를 2MB로 늘리려면 adb logcat -G 2M을 실행하세요. 최대 크기는 기기에 따라 다릅니다: Android 10+에서는 최대 16MB까지 사용 가능합니다. 변경 사항은 기기가 재부팅될 때까지 유지됩니다. 영구 설정을 위해 device tree의 build.prop을 사용하세요.

Logcat이 애플리케이션 로그를 표시하지 않는 이유

가능한 원인: 애플리케이션이 Release 모드로 실행 중임(Timber.v/d 로그 비활성화), Logcat 필터가 필요한 레벨을 숨기고 있음, 또는 잘못된 기기에 연결됨. 또한 Android Studio에서 애플리케이션의 프로세스를 선택했는지 확인하세요(system_process가 아님).

Logcat에서 크래시 로그를 읽는 방법

FATAL EXCEPTION이 있는 을 찾으세요. 그 아래에 전체 스택 트레이스가 있습니다. 첫 번째 줄에는 예외 유형과 메시지가 포함되고, 이후 줄에는 파일 및 코드 라인 정보가 있는 호출 체인이 포함됩니다. 모든 로그 중에서 빠르게 검색하려면 grep "FATAL EXCEPTION"을 사용하세요.

ANR이란 무엇이며 Logcat에서 감지하는 방법

ANR(Application Not Responding)은 메인 스레드(UI 스레드)가 5초 이상 차단되는 상황입니다. Logcat에서 ANR은 ActivityManager 태그와 "ANR in ..." 텍스트가 있는 메시지로 나타나며 모든 스레드의 스택 트레이스가 첨부됩니다. 필터 tag:ActivityManager level:ERROR을 사용하세요.

요약

  • Logcat — ADB 및 Android Studio의 내장 창을 통해 접근 가능한 Android 시스템 버퍼
  • 6가지 레벨의 로깅(VERBOSE — ASSERT)이 메시지 중요도와 필터링 임계값 결정
  • 태그는 빠른 필터링을 위해 애플리케이션 모듈별로 메시지를 그룹화 가능
  • ADB logcat과 grep/awk는 GUI보다 유연하며 CI/CD 파이프라인에 적합
  • Timber는 로깅을 단순화하고, 자동으로 태그를 삽입하며 Release에서 Debug 레벨 비활성화
  • 크래시 로그는 예외 및 스택 트레이스와 함께 모든 크래시 시 자동으로 Logcat에 전달
  • 저장된 필터는 Android Studio에서 일상적인 로그 분석 속도 향상

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기