logcat 명령줄 도구

Logcat은 기기에서 오류와 메시지(앱에서 Log 클래스로 작성)가 발생할 때 스택 추적을 비롯하여 시스템 메시지의 로그를 덤프해주는 명령줄 도구입니다.

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

명령줄 구문

ADB 셸을 통해 logcat을 실행할 경우 일반적인 사용법은 다음과 같습니다.

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

logcat을 adb 명령으로 실행하거나 에뮬레이터 또는 연결된 기기의 셸 프롬프트에서 직접 실행할 수 있습니다. adb를 사용하여 로그 출력을 보려면 SDK platform-tools/ 디렉터리로 이동하여 다음 명령을 실행합니다.

    adb logcat
    

logcat 온라인 도움말을 보려면 기기를 시작한 후 다음을 실행합니다.

    adb logcat --help
    

기기에 관한 셸 연결을 만들고 다음 명령을 실행할 수 있습니다.

    $ adb shell
    # logcat
    

옵션

다음 표는 logcat의 명령줄 옵션을 설명합니다.

옵션 설명
-b <buffer> 보기 위한 대체 로그 버퍼를 로드합니다(예: events 또는 radio). main, systemcrash 버퍼 세트가 기본적으로 사용됩니다. 대체 로그 버퍼 보기를 참조하세요.
-c, --clear 선택한 버퍼를 지우고(플러시하고) 종료합니다. 기본 버퍼 세트는 main, systemcrash입니다. 모든 버퍼를 지우려면 -b all -c를 사용합니다.
-e <expr>, --regex=<expr> 로그 메시지가 <expr>과 일치하는 줄만 출력합니다. 여기서 <expr>은 정규 표현식입니다.
-m <count>, --max-count=<count> <count>개 줄을 출력한 후 종료합니다. --regex와의 페어링이 필요하지만 자체적으로도 작동합니다.
--print --regex--max-count와 페어링하면 콘텐츠가 정규 표현식을 우회할 수 있지만, 여전히 올바른 일치 숫자에서 중지합니다.
-d 로그를 화면에 덤프하고 종료합니다.
-f <filename> 로그 메시지 출력을 <filename>에 씁니다. 기본값은 stdout입니다.
-g, --buffer-size 지정된 로그 버퍼의 크기를 출력하고 종료합니다.
-n <count> 순환되는 로그의 최대 수를 <count>로 설정합니다. 기본값은 4입니다. -r 옵션이 필요합니다.
-r <kbytes> 출력의 <kbytes>마다 로그 파일을 순환시킵니다. 기본값은 16입니다. -f 옵션이 필요합니다.
-s filterspec '*:S'와 동일하며 콘텐츠를 추가하는 filterspec 목록 앞에 두기 위해 사용합니다.
-v <format> 로그 메시지의 출력 형식을 설정합니다. 기본값은 threadtime 형식입니다. 지원되는 형식의 목록은 로그 출력 형식 제어를 참조하세요.
-D, --dividers 각 로그 버퍼 간의 구분선을 출력합니다.
-c 전체 로그를 플러시하고(지우고) 종료합니다.
-t <count> 가장 최근의 줄 수만 출력합니다. 이 옵션은 -d 기능을 포함합니다.
-t '<time>' 지정된 시간 이후 가장 최근의 줄을 출력합니다. 이 옵션은 -d 기능을 포함합니다. 공백이 있는 매개변수에 따옴표를 사용하는 방법에 관한 자세한 내용은 -P 옵션을 참조하세요.

adb logcat -t '01-26 20:52:41.820'
-T <count> 지정된 시간 이후 가장 최근의 줄 수를 출력합니다. 이 옵션은 -d 기능을 포함하지 않습니다.
-T '<time>' 지정된 시간 이후 가장 최근의 줄을 출력합니다. 이 옵션은 -d 기능을 포함하지 않습니다. 공백이 있는 매개변수에 따옴표를 사용하는 방법에 관한 자세한 내용은 -P 옵션을 참조하세요.

adb logcat -t '01-26 20:52:41.820'
-L, -last 마지막 재부팅 전에 로그를 덤프합니다.
-B, --binary 로그를 바이너리로 출력합니다.
-S, --statistics 로그 스패머를 식별하고 타겟팅할 수 있도록 통계를 출력에 포함합니다.
-G <size> 로그 링 버퍼의 크기를 설정합니다. K 또는 M을 끝에 추가하여 킬로바이트나 메가바이트를 표시합니다.
-p, --prune 현재의 허용 목록과 차단 목록을 출력하고(읽고) 다음과 같이 인수를 사용하지 않습니다.

    adb logcat -p
    
-P '<list> ...'
--prune '<list> ...' -P '<white_and_black_list>'
허용 목록과 차단 목록을 작성(설정)하여 특정 목적을 위한 로깅 콘텐츠를 조정합니다. <white>~<black> 목록 항목의 혼합된 콘텐츠를 제공합니다. 여기서 <white> 또는 <black>은 UID, UID/PID 또는 /PID일 수 있습니다. logcat 통계(logcat -S)의 지침에 따라 다음과 같은 목적으로 허용 목록과 차단 목록을 조정할 수 있습니다.
  • UID 선택을 통해 특정 로깅 콘텐츠에 가장 긴 수명을 제공합니다.
  • 차단 목록 who(UID) 또는 what(PID)은 logspan을 늘리기 위해 이러한 리소스를 사용합니다. 그러면 진단 중인 문제를 더 잘 볼 수 있습니다.

기본적으로 로깅 시스템은 로그 통계에서 최악의 위반자를 자동으로 차단 목록에 추가하여 새로운 로그 메시지를 위한 공간을 동적으로 만듭니다. 휴리스틱이 고갈되면 시스템은 가장 오래된 항목을 잘라내어 새 메시지를 위한 공간은 만듭니다.

허용 목록을 추가하면 AID(Android Identification Number)가 보호되어 프로세스의 AID 및 GID가 위반자로 선언되는 것을 방지할 수 있으며, 차단 목록을 추가하면 최악의 위반자로 간주되기 전에 공간을 확보할 수 있습니다. 잘라내기를 얼마나 적극적으로 할지 선택할 수 있습니다. 또한 각 로그 버퍼의 가장 오래된 항목에서만 콘텐츠를 삭제하도록 잘라내기를 해제할 수도 있습니다.

따옴표

adb logcat은 따옴표를 유지하지 않으므로 허용 목록과 차단 목록을 지정하기 위한 구문은 다음과 같습니다.


    $ adb logcat -P '"<white_and_blacklist>"'

    or

    adb shell
    $ logcat -P '<white_and_blacklist>'
    

다음 예제는 PID 32676 및 UID 675로 허용 목록을 지정하고, PID 32677 및 UID 897로 차단 목록을 지정합니다. 더 빠른 잘라내기를 위해 차단 목록의 PID 32677에는 가중치가 적용됩니다.


    adb logcat -P '"/32676 675 ~/32677 897"'
    

사용할 수 있는 다른 차단 목록 및 허용 목록 명령어 변형은 다음과 같습니다.


    ~! worst uid blacklist
    ~1000/! worst pid in system (1000)
    
--pid=<pid> ... 지정된 PID의 로그만 출력합니다.
--wrap 두 시간 동안 절전 모드일 때 또는 버퍼가 래핑하려고 할 때 중 하나가 먼저 발생하는 경우 about-to-wrap wakeup을 제공하여 폴링의 효율성을 높입니다.

로그 출력 필터링

  • 로그 메시지의 태그는 메시지가 발생하는 시스템 구성요소를 나타내는 짧은 문자열입니다(예: 뷰 시스템의 경우 '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 지정을 단일 필터 식에 넣을 수 있습니다. 일련의 사양은 공백으로 구분됩니다.

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

    adb logcat ActivityManager:I MyApp:D *:S
    

위의 식에서 마지막 요소인 *:S는 모든 태그의 우선순위 레벨을 'silent'로 설정하며, 태그가 'ActivityManager' 및 'MyApp'인 로그 메시지만 표시되도록 보장합니다. *:S 사용은 명시적으로 지정했던 필터로만 로그 출력을 제한하는 최상의 방법입니다. 이 경우 필터는 로그 출력의 '허용 목록'으로 사용됩니다.

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

    adb logcat *:W
    

개발용 컴퓨터에서 logcat을 실행 중인 경우(원격 adb 셸에서 실행 중일 때와 비교), 환경 변수 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, systemcrash 버퍼를 보고합니다.

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

    [adb] logcat [-b <buffer>]
    

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

    adb logcat -b radio
    

출력할 모든 버퍼에 관해 다음과 같이 -b 플래그를 여러 개 지정할 수도 있습니다.

    logcat -b main -b radio -b events
    

다음과 같이 쉼표로 구분된 버퍼 목록과 함께 단일 -v 플래그를 지정할 수 있습니다.

    logcat -v main,radio,events
    

코드에서 로깅

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

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

Kotlin

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

자바

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

logcat 출력은 다음과 같습니다.

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