모의해킹/안드로이드

디바이스 로그 내 중요정보 점검방법론

logthink 2022. 1. 13. 23:06

logcat 명령줄 도구

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

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

명령줄 구문

가장 자주 쓰는 구문은

adb logcat {로그 필터} --pid = {PID}

 

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

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

$ adb logcat

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

$ adb shell

# logcat

옵션

다음 표는 logcat의 명령줄 옵션에 대해 설명합니다.

옵션
설명
-b <buffer>
보기 위한 대체 로그 버퍼를 로드합니다(예: events 또는 radio). main 버퍼가 기본적으로 사용됩니다. 대체 로그 버퍼 보기를 참조하세요.
-c
전체 로그를 지우고(플러시하고) 종료합니다.
-d
로그를 화면에 덤프하고 종료합니다.
-f <filename>
로그 메시지 출력을 <filename>에 씁니다. 기본값은 stdout입니다.
-g
지정된 로그 버퍼의 크기를 출력하고 종료합니다.
-n <count>
순환되는 로그의 최대 수를 <count>로 설정합니다. 기본값은 4입니다. -r 옵션은 필수입니다.
-r <kbytes>
출력의 <kbytes>마다 로그 파일을 순환시킵니다. 기본값은 16입니다. -f 옵션은 필수입니다.
-s
기본 필터 사양을 silent로 설정합니다.
-v <format>
로그 메시지의 출력 형식을 설정합니다. 기본값은 brief 형식입니다. 지원되는 형식의 목록은 로그 출력 형식 제어를 참조하세요.

logcat 시작

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

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

logcat 명령은 개발용 컴퓨터에서 사용되거나 에뮬레이터/기기 인스턴스의 원격 adb 셸에서 사용될 수 있습니다. 개발용 컴퓨터에서 로그 출력을 보려면 다음 명령을 사용할 수 있습니다.

$ adb logcat

또한 원격 adb 셸에서는 다음 명령을 사용합니다.

# logcat

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

-c
전체 로그를 지우고(플러시하고) 종료합니다.
-d
로그를 화면에 덤프하고 종료합니다.
-f <filename>
로그 메시지 출력을 <filename>에 씁니다. 기본값은 stdout입니다.
-g
지정된 로그 버퍼의 크기를 출력하고 종료합니다.
-n <count>
순환되는 로그의 최대 수를 <count>로 설정합니다. 기본값은 4입니다. -r 옵션은 필수입니다.
-r <kbytes>
출력의 <kbytes>마다 로그 파일을 순환시킵니다. 기본값은 16입니다. -f 옵션은 필수입니다.
-s
기본 필터 사양을 silent로 설정합니다.
-v <format>
로그 메시지의 출력 형식을 설정합니다. 기본값은 brief 형식입니다. 지원되는 형식의 목록은 로그 출력 형식 제어를 참조하세요.

로그 출력 필터링

모든 Android 로그 메시지에는 연관된 태그와 우선순위가 있습니다.

로그 메시지의 태그는 메시지가 발생하는 시스템 구성 요소를 나타내는 짧은 문자열입니다(예: 뷰 시스템의 경우 "View").

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

V — Verbose (가장 낮은 우선순위)

D — Debug

I — Info

W — Warning

E — Error

F — Fatal

S — Silent(가장 높은 순위, 이 경우 아무 것도 출력되지 않음)

logcat을 실행하고 각 메시지의 처음 두 열을 관찰함으로써 시스템에 사용된 태그 목록을 우선순위와 함께 구할 수 있습니다(<priority>/<tag>로 지정).

다음 예시는 메시지가 우선순위 레벨 "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"로 설정하며, 태그가 "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를 표시합니다(기본 형식).

process — PID만을 표시합니다.

tag — 우선순위/태그만을 표시합니다.

raw — 다른 메타데이터 필드는 없이 원시 로그 메시지를 표시합니다.

time — 메시지를 발급하는 프로세스의 날짜, 호출 시간, 우선순위/태그 및 PID를 표시합니다.

threadtime — 메시지를 발급하는 스레드의 날짜, 호출 시간, 우선순위/태그, PID 및 TID를 표시합니다.

long — 모든 메타데이터 필드와 별도의 메시지를 빈 줄과 함께 표시합니다.

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

[adb] logcat [-v <format>]

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

adb logcat -v thread

참고로, -v 옵션에는 하나의 출력 형식만을 지정할 수 있습니다.

대체 로그 버퍼 보기

Android 로깅 시스템은 로그 메시지에 대해 여러 개의 원형 버퍼를 유지하며, 모든 로그 메시지가 기본 원형 버퍼로 전송되는 것은 아닙니다. 추가적인 로그 메시지를 보려면, logcat 명령을 -b 옵션으로 실행하여 대체 원형 버퍼 보기를 요청할 수 있습니다. 다음과 같은 대체 버퍼를 볼 수 있습니다.

radio — 무선/전화통신 관련 메시지가 포함된 버퍼를 봅니다.

events — 이벤트 관련 메시지가 포함된 버퍼를 봅니다.

main — 메인 로그 버퍼를 봅니다(기본값).

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

[adb] logcat [-b <buffer>]

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

adb logcat -b radio

stdout 및 stderr 보기

기본적으로, Android 시스템은 stdout 및 stderr 출력(System.out 및 System.err)을 /dev/null로 전송합니다. Dalvik VM이 실행되는 프로세스에서는, 출력의 복사본을 로그 파일에 쓰도록 시스템에 지시할 수 있습니다. 이 경우 시스템은 stdout 및 stderr 태그와 I 우선순위를 사용하여 메시지를 로그에 씁니다.

이런 방식으로 출력을 라우팅하려면 실행 중인 에뮬레이터/기기 인스턴스를 중지한 다음, 셸 명령 setprop를 사용하여 출력 리디렉션을 활성화합니다. 다음은 그 방법을 보여줍니다.

$ adb shell stop

$ adb shell setprop log.redirect-stdio true

$ adb shell start

시스템은 여러분이 에뮬레이터/기기 인스턴스를 종료할 때까지 이 설정을 유지합니다. 에뮬레이터/기기 인스턴스에서 이 설정을 기본값으로 사용하려면, 기기에서 /data/local.prop에 항목을 추가할 수 있습니다.

코드에서 로깅

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

Log.v(String, String) (verbose)

Log.d(String, String) (debug)

Log.i(String, String) (information)

Log.w(String, String) (warning)

Log.e(String, String) (error)

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

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

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

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

Log cat 내용을 파일에 저장하려면 Android sdk의 플랫폼 도구 폴더로 리디렉션하고 아래 명령을 실행해야합니다

adb logcat > logcat.txt

platform-tools 폴더에 "logcat.txt"라는 이름의 파일이 생성됩니다. 당신은 관심사에 따라 이름을 바꿀 수 있습니다. 즐겨

Dinesh Prajapati의 답변 외에도

adb -d logcat <your package name>:<log level>

여기서 -d는 장치 용이며 에뮬레이터 로그 대신 -e를 선택할 수도 있으며 로그 수준은 a/d/i/v/e/w 등입니다.

이제 명령은 다음과 같이됩니다.

adb -d logcat com.example.example:V > logfileName_WithPath.txt