Logcat 명령줄 도구

Logcat은 Log 클래스를 사용하여 앱에서 작성한 메시지 등 시스템 메시지의 로그를 덤프하는 명령줄 도구입니다.

이 페이지는 명령줄 logcat 도구에 관해 설명하지만 Android 스튜디오의 Logcat 창에서 로그 메시지를 볼 수도 있습니다. Android 스튜디오에서 로그를 보고 필터링하는 방법은 Logcat에서 로그 보기 및 쓰기를 참고하세요.

로깅 시스템 개요

Android 로깅 시스템은 logd 시스템 프로세스에 의해 유지관리되는 구조화된 순환 버퍼 집합입니다. 사용 가능한 버퍼 집합은 시스템에 의해 고정되고 정의됩니다. 가장 관련 있는 버퍼는 다음과 같습니다.

  • main: 대부분의 애플리케이션 로그를 저장합니다.
  • system: Android OS에서 시작된 메시지를 저장합니다.
  • crash: 비정상 종료 로그를 저장합니다. 각 로그 항목에는 우선순위, 로그 출처를 식별하는 태그, 실제 로그 메시지가 포함되어 있습니다.

로깅 시스템의 기본 C/C++ 인터페이스는 공유 라이브러리 liblog 및 헤더 <android/log.h>입니다. 모든 언어별 로깅 기능(android.util.Log 포함)은 결국 __android_log_write 함수를 호출합니다. 기본적으로 소켓을 사용하여 로그 항목을 logd로 전송하는 __android_log_logd_logger 함수를 호출합니다. API 수준 30부터 시작하며 로깅 함수는 __android_set_log_writer를 호출함으로써 변경될 수 있습니다. 자세한 내용은 NDK 문서를 참고하세요.

adb logcat님이 표시하는 로그는 4가지 수준의 필터링 과정을 거칩니다.

컴파일 시간 필터링
컴파일 설정에 따라 일부 로그는 바이너리에서 완전히 삭제될 수도 있습니다. 예를 들어 ProGuard가 자바 코드로 작성된 Log.d 호출을 삭제하도록 설정할 수 있습니다.
시스템 속성 필터링
liblog는 시스템 속성 집합을 쿼리하여 logd로 전송될 최소 심각도 수준을 결정합니다. 로그에 MyApp 태그가 포함된 경우 다음 속성이 확인되며 최소 심각도의 첫 글자가 포함될 것으로 예상됩니다(V, D, I, W, E 또는 모든 로그를 사용 중지하는 S).
  • log.tag.MyApp
  • persist.log.tag.MyApp
  • log.tag
  • persist.log.tag
애플리케이션 필터링
설정된 속성이 없으면 liblog__android_log_set_minimum_priority에 의해 설정된 최소 우선순위를 사용합니다. 기본 설정은 INFO입니다.
디스플레이 필터링
adb logcatlogd에서 표시된 로그 양을 줄일 수 있는 추가 필터를 지원합니다. 자세한 내용은 로그 출력 필터링 섹션을 참고하세요.

명령줄 문법

adb 셸을 통해 logcat을 실행하려면 일반적인 사용법은 다음과 같습니다.

[adb] shell logcat [<option>] ... [<filter-spec>] ...

adb logcat의 약식 표현도 있지만 이는 adb shell logcat으로 확장됩니다.

옵션

logcat에는 옵션이 많습니다. 사용할 수 있는 옵션은 사용 중인 기기의 OS 버전에 따라 다릅니다. 사용 중인 기기와 관련된 logcat의 도움말을 보려면 다음을 실행하세요.

    adb logcat --help
    

logcat은 OS 개발자뿐 아니라 앱 개발자(앱 개발자가 Android 스튜디오를 대신 사용할 것으로 예상됨)를 위한 도구이므로 대부분의 옵션은 root로만 사용할 수 있습니다.

로그 출력 필터링

로그 메시지의 태그는 메시지가 발생한 시스템 구성요소를 나타내는 짧은 문자열입니다. 뷰 시스템의 경우 'View'를 예로 들 수 있습니다.

우선순위는 다음 문자값 중 하나이며, 가장 낮은 우선순위에서 가장 높은 우선순위로 지정됩니다.

    • V: Verbose(가장 낮은 우선순위)
    • D: Debug
    • I: Info
    • W: Warning
    • E: Error
    • F: Fatal
    • S: Silent(가장 높은 우선순위, 아무것도 출력되지 않음)
  • 시스템에서 사용되는 태그 목록을 우선순위와 함께 가져오려면 logcat을 실행하고 각 메시지의 처음 두 열을 살펴보세요(<priority>/<tag>로 지정).

    다음은 logcat -v brief output 명령어로 가져온 간단한 logcat 출력의 예입니다. 메시지가 우선순위 수준 'I' 및 태그 'ActivityManager'와 관련되어 있음을 보여줍니다.

    I/ActivityManager(  585): Starting activity: Intent { action=android.intent.action...}
    

    로그 출력을 관리하기 쉬운 수준으로 줄이려면 필터 표현식을 사용하여 로그 출력을 제한합니다. 필터 표현식을 사용하면 원하는 태그-우선순위 조합을 시스템에 표시할 수 있습니다. 시스템은 지정된 태그의 다른 메시지를 억제합니다.

    필터 표현식의 형식은 tag:priority ...와 같으며, 여기서 tag는 원하는 태그를 나타내고 priority는 이 태그에 관해 보고할 최소 수준의 우선순위를 나타냅니다. 지정된 우선순위 이상인 태그에 관해 메시지가 로그에 기록됩니다. 원하는 개수의 tag:priority 사양을 단일 필터 표현식에 제공합니다. 일련의 사양은 공백으로 구분됩니다.

    다음 필터 표현식 예에서는 우선순위가 'Info' 이상인 'ActivityManager' 태그가 있는 로그 메시지와 우선순위가 'Debug' 이상인 'MyApp' 태그가 있는 로그 메시지를 제외하고 모든 로그 메시지를 억제합니다.

    adb logcat ActivityManager:I MyApp:D *:S
    

    위의 표현식에서 마지막 요소인 *:S는 모든 태그의 우선순위 수준을 'silent'로 설정하며, 이를 통해 'ActivityManager' 및 'MyApp'이 있는 로그 메시지만 표시됩니다. *:S를 사용하면 명시적으로 지정한 필터로 로그 출력이 제한됩니다. *:S를 사용하면 필터가 로그 출력의 허용 목록 역할을 합니다.

    참고: 일부 셸에서 '*' 문자는 셸에 의해 예약됩니다. 이러한 셸을 사용하는 경우 다음과 같이 필터 표현식을 따옴표로 묶습니다. adb logcat "ActivityManager:I MyApp:D *:S"

    다음 필터 표현식에서는 모든 태그에서 우선순위가 'warning' 이상인 모든 로그 메시지를 표시합니다.

    adb logcat *:W
    

    원격 adb 셸에서 실행하는 대신 개발 컴퓨터에서 logcat을 실행하는 경우 환경 변수 ANDROID_LOG_TAGS의 값을 내보내 기본 필터 표현식을 설정할 수도 있습니다.

    export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
    

    원격 셸에서 logcat을 실행하거나, adb shell logcat을 사용하는 경우 ANDROID_LOG_TAGS 필터는 에뮬레이터/기기 인스턴스로 내보낼 수 없습니다.

    로그 출력 형식 제어

    로그 메시지에는 태그 및 우선순위 이외에도 여러 메타데이터 필드가 포함됩니다. 특정 메타데이터 필드만 표시하도록 메시지의 출력 형식을 수정할 수 있습니다. 이렇게 하려면 -v 옵션을 사용하고 지원되는 다음 출력 형식 중 하나를 지정하세요.

    • brief: 메시지를 발급하는 프로세스의 우선순위, 태그, PID를 표시합니다.
    • long: 모든 메타데이터 필드와 별도의 메시지를 빈 줄과 함께 표시합니다.
    • process: PID만 표시합니다.
    • raw: 다른 메타데이터 필드가 없는 원시 로그 메시지를 표시합니다.
    • tag: 우선순위와 태그만 표시합니다.
    • thread:: 메시지를 발급하는 스레드의 날짜, 호출 시간, 우선순위/태그, PID, TID를 표시하는 기존 형식입니다.
    • threadtime(기본값): 메시지를 발급하는 스레드의 날짜, 호출 시간, 우선순위/태그, PID, TID를 표시합니다.
    • time: 메시지를 발급하는 프로세스의 날짜, 호출 시간, 우선순위/태그, PID를 표시합니다.

    logcat을 시작할 때 -v 옵션을 사용하여 원하는 출력 형식을 지정합니다.

    [adb] logcat [-v <format>]
    

    다음 예제는 메시지를 thread 출력 형식으로 생성하는 방법을 보여줍니다.

    adb logcat -v thread
    

    -v 옵션으로는 하나의 출력 형식만 지정할 수 있습니다. 그러나 적절한 경우 수정자를 필요한 만큼 지정할 수 있습니다. logcat은 적절하지 않은 수정자를 무시합니다.

    형식 수정자

    형식 수정자는 logcat 출력을 변경합니다. 형식 수정자를 지정하려면 다음과 같이 -v 옵션을 사용하세요.

    adb logcat -b all -v color -d
    

    모든 Android 로그 메시지에는 태그 및 태그와 연관된 우선순위가 있습니다. 형식 수정자를 다음 형식 옵션 중 하나와 결합할 수 있습니다.

    • brief
    • long
    • process
    • raw
    • tag
    • thread
    • threadtime
    • time

    다음 수정자 세부정보의 형식을 지정하려면 명령줄에 logcat -v --help를 입력하세요.

    • color: 각 우선순위 수준을 다른 색상으로 표시합니다.
    • descriptive: 로그 버퍼 이벤트 설명을 표시합니다. 이 수정자는 이벤트 로그 버퍼 메시지에만 영향을 미치며 다른 비 바이너리 버퍼에는 영향을 미치지 않습니다. 이벤트 설명은 이벤트 로그 태그 데이터베이스에서 가져옵니다.
    • epoch: 1970년 1월 1일부터 시작되는 초 단위의 시간을 표시합니다.
    • monotonic: 마지막 부팅에서 시작하여 CPU 초 단위로 시간을 표시합니다.
    • printable: 바이너리 로깅 콘텐츠가 이스케이프되었는지 확인합니다.
    • uid: 액세스 제어에서 허용하는 경우 로깅된 프로세스의 UID 또는 Android ID를 표시합니다.
    • usec: 마이크로초 단위의 정밀도로 시간을 표시합니다.
    • UTC: 시간을 UTC로 표시합니다.
    • year: 표시된 시간에 연도를 추가합니다.
    • zone: 표시된 시간에 현지 시간대를 추가합니다.

    대체 로그 버퍼 보기

    Android 로깅 시스템은 로그 메시지에 관해 여러 개의 순환 버퍼를 유지합니다. 모든 로그 메시지가 기본 순환 버퍼로 전송되는 것은 아닙니다. 추가 로그 메시지를 보려면 logcat 명령어를 -b 옵션과 함께 실행하여 대체 순환 버퍼 보기를 요청하세요. 다음과 같은 대체 버퍼를 볼 수 있습니다.

    • radio: 무선/전화 통신 관련 메시지가 포함된 버퍼를 봅니다.
    • events: 해석된 바이너리 시스템 이벤트 버퍼 메시지를 봅니다.
    • main: 시스템 및 비정상 종료 로그 메시지를 포함하지 않는 기본 로그 버퍼를 봅니다(기본값).
    • system: 시스템 로그 버퍼를 봅니다(기본값).
    • crash: 비정상 종료 로그 버퍼를 봅니다(기본값).
    • all: 모든 버퍼를 봅니다.
    • default: main, system, crash 버퍼를 보고합니다.

    -b 옵션의 사용법은 다음과 같습니다.

    [adb] logcat [-b <buffer>]
    

    다음 예는 무선 및 전화통신 메시지가 포함된 로그 버퍼를 보기 위한 방법입니다.

    adb logcat -b radio
    

    출력할 모든 버퍼에 관해 -b 플래그를 여러 개 지정하려면 다음을 입력합니다.

    logcat -b main -b radio -b events
    

    쉼표로 구분된 버퍼 목록과 함께 단일 -b 플래그를 지정합니다. 예를 들면 다음과 같습니다.

    logcat -b main,radio,events
    

    코드에서 로그

    Log 클래스를 사용하면 코드에서 logcat 도구에 표시되는 로그 항목을 만들 수 있습니다. 일반적인 로깅 메서드에는 다음이 포함됩니다.

    예를 들어, 다음 호출을 사용할 경우:

    Kotlin

    Log.i("MyActivity", "MyClass.getView() — get item number $position")
    

    Java

    Log.i("MyActivity", "MyClass.getView() — get item number " + position);
    

    logcat은 다음과 유사한 결과를 출력합니다.

    I/MyActivity( 1557): MyClass.getView() — get item number 1