2011. 7. 28. 04:32

[번역] Log 읽고 쓰기

안드로이드 로깅 시스템은 시스템 디버그 출력을 수집하고 보기 위한 매커니즘을 제공합니다. Logcat 은 시스템 메시지 로그를 덤프하고, 이것은 스택 트레이스와 같은 것들을 포함하고 있습니다. ADB 또는 DDMS 를 이용하여 LogCat 를 실행할 수 있습니다.

Log 클래스

Log 는 LogCat 에다가 메시지를 출력하기 위해 코드 내에 이용할 수 있는 로깅 클래스입니다. 일반적인 로깅 메소드는 다음과 같습니다.


예를 들어,

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

LogCat 은 아래처럼 출력될 것입니다.

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

LogCat 사용하기


DDMS 에서 또는 ADB 셀에서 LogCat 을 사용할 수 있습니다. DDMS 내에서 LogCat 을 사용하는 방법에 대해서는 
 Using DDMS 를 참고하세요. ADB 셀에서 LogCat 을 실행하기 위한 일반적인 사용법은 다음과 같습니다.


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

개발용 컴퓨터에서 또는 에뮬레이터/장치 인스턴스의 원격 adb 셀에서 logcat 명령을 사용할 수 있습니다. 개발용 컴퓨터에서 로그 출력을 보기 위해서는 다음과 같이 합니다.

$ adb logcat

그리고 원격 adb 셀에서는 다음과 같이 합니다.

# logcat

아래 표는 logcat 명령어 라인 옵션을 나타냅니다.

-c Clears (flushes) the entire log and exits.
-d Dumps the log to the screen and exits.
-f <filename> Writes log message output to <filename>. The default is stdout.
-g Prints the size of the specified log buffer and exits.
-n <count> Sets the maximum number of rotated logs to <count>. The default value is 4. Requires the -r option.
-r <kbytes> Rotates the log file every <kbytes> of output. The default value is 16. Requires the -f option.
-s Sets the default filter spec to silent.
-v <format> Sets the output format for log messages. The default is brief format. For a list of supported formats, see Controlling Log Output Format.

로그 출력 필터링

모든 안드로이드 로그 메시지는 태그와 우선순위를 가지고 있습니다.

  • 태그는 메시지가 어디에서 기원하는 지를 나타내는 짧은 문자열입니다. (예를 들면, "View" 는 view 시스템)
  • 우선순위는 아래 문자 값들 중의 하나이며, 우선순위가 낮은 것에서부터 높은것 으로 정렬하였습니다.
  • V — Verbose (lowest priority)
  • D — Debug
  • I — Info
  • W — Warning
  • E — Error
  • F — Fatal
  • S — Silent (highest priority, on which nothing is ever printed)

LogCat 을 실행한 후 각 메시지의 처음 두 칼럼을 살펴봄으로써 시스템에 사용된 우선순위/태그의 리스트를 얻을 수 있습니다.

아래는 우선순위 레벨이 "I" 이고 태그가 "ActivityManager" 인 메시지를 출력하는 logcat 출력의 예입니다.

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" 로 설정하여, "View" 와 "MyApp" 을 가지는 로그 메시지만이 표시되도록 합니다. *:S 를 사용하는 것은 명시적으로 나열한 필터만 출력하도록 하는 훌륭한 방법입니다.

아래 필터 표현식은 "warning" 우선순위 또는 그 이상의 모든 메시지를 출력합니다.

만약 개발용 컴퓨터(이와 다른 방법은 원격 adb 셀에서 실행되는 것) 에서 LogCat 을 실행하고 있다면, 환경 변수 ANDROID_LOG_TAGS 에 값을 설정함으로써 디폴터 필터를 설정할 수 있습니다.

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


만일 원격 셀 또는 adb shell logcat 을 사용하여 LogCat을 실행중이라면, 에뮬레이터/디바이스 인스턴스에는 ANDROID_LOG_TAGS 필터가 적용되지 않는다는 것을 기억하세요.

로그 출력 포맷 제어하기

로그 메시지는 태그와 우선순위 외에도 많은 메타데이터 필드를 포함하고 있습니다. 출력 포맷을 수정함으로써 특정 메타데이터 필드를 표시하도록 할 수 있습니다. 그렇게 하기 위해서는, -v 옵션을 사용하며 아래에 나열된 출력 양식중 하나를 지정하면 됩니다.

  • brief — Display priority/tag and PID of originating process (the default format).
  • process — Display PID only.
  • tag — Display the priority/tag only.
  • thread — Display process:thread and priority/tag only.
  • raw — Display the raw log message, with no other metadata fields.
  • time — Display the date, invocation time, priority/tag, and PID of the originating process.
  • long — Display all metadata fields and separate messages with blank lines.

LogCat 을 시작할 때, -v 옵션 을 사용하여 출력 포맷을 지정할 수 잇습니다.

[adb] logcat [-v <format>]


아래는 thread 출력 포맷을 표시하기 위한 방법을 보여줍니다.

adb logcat -v thread

-v 옵션은 오직 하나만 지정할 수 있다는 것을 기억하세요.

선택적인 로그 버퍼 보기 (Viewing Alternative Log Buffers)

안드로이드 로깅 시스템은 로그 메시지를 위해 다수의 원형 버퍼(multiple circular bufers)를 유지합니다, 그리고 모든 로그 메시지가 디폴트 원형 버퍼에 전달되는 것은 아닙니다. 추가적인 로그 메시지를 보기 위해서는, 다른 원형 버퍼 보기를 요청하기 위해, -b 옵션을 이용할 수 있습니다. 아래는 사용가능한 버퍼 목록입니다.

  • radio — View the buffer that contains radio/telephony related messages.
  • events — View the buffer containing events-related messages.
  • main — View the main log buffer (default)

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

[adb] logcat [-b <buffer>]

radio 와 telephony 메시지를 포함하는 로그 버퍼를 보기위한 예제는 다음과 같습니다.

adb logcat -b radio

stdout 과 stderr 보기

디폴트로, 안드로이 시스템은 stdout (표준 입력) 과 stderr (표준 에러) 를 /dev/null 로 보냅니다. Dalvik VM 을 실행하는 프로세스에 대해서는 시스템이 출력의 사본을 로그 파일에다가 작성하도록 할 수 있습니다. 이 경우, 시스템은 stdout 과 stderr 태그, 그리고 우선순위 I 를 가지는 메시지를 출력합니다.

이런식으로 출력을 재지정하기 위해서는, 실행중인 에뮬레이터/장치 인스턴스를 멈춥니다 그리고 출력 재지정을 활성화하기 위해 setprop 셀 명령을 사용합니다.

$ adb shell stop
$ adb shell setprop log
.redirect-stdio true

$ adb shell start

시스템은 에뮬레이터/장치 인스턴스가 종료될 때까지 이 설정을 유지합니다. 에뮬레이터/장치 인스턴스에서 이 설정을 디폴트로 사용하기 위해서는,  /data/local.prop 에다가 값을 추가해 주면 됩니다.

Web 애플리케이션 디버깅

안드로이드를 위한 웹 애플리케이션을 개발하고 있다면, 콘솔 JavaScript API 를 사용하여 JavaScript 를 디버그할 수 있습니다, 그리고 이것은 메시지를 LogCat 에 출력합니다. 상세한 정보는  Debugging Web Apps 를 보시기 바랍니다. 

원본: http://developer.android.com/guide/developing/debugging/debugging-log.html