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 logcat
은logd
에서 표시된 로그 양을 줄일 수 있는 추가 필터를 지원합니다. 자세한 내용은 로그 출력 필터링 섹션을 참고하세요.
명령줄 문법
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
: DebugI
: InfoW
: WarningE
: ErrorF
: FatalS
: 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
도구에 표시되는 로그 항목을 만들 수 있습니다. 일반적인 로깅 메서드에는 다음이 포함됩니다.
Log.v(String, String)
(상세)Log.d(String, String)
(디버그)Log.i(String, String)
(정보)Log.w(String, String)
(경고)Log.e(String, String)
(오류)
예를 들어, 다음 호출을 사용할 경우:
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