슈퍼드로이드 카페의 안드로이드 강좌가 책으로 나왔습니다.
도서명 : 이것이 안드로이드다.
도서링크 : http://www.yes24.com//24/goods/13950202
================================================================================================
1. 로그 출력하기
프로그램을 개발하다보면 특정 소스로 진입 여부나 변수의 값,
기타 상태 정보등을 실시간으로 출력하고 싶을 때가 많을 것이다.
Logcat은 이러한 여러가지 상태 정보를 String으로 출력 가능하다.
단지 사용자가 출력하고자 하는 곳에 간단한 내용만 적어 주면 된다.
아래의 소스를 참조하자.
위에서 Log라고 적힌 부분이 로그를 출력하도록 하는 코드이다.
해당 소스를 실행한뒤 로그를 확인해 보자.
1.1 Eclipse 상에서 Logcat 이용하기
해당 로그는 Eclipse의 툴 환경에서
DDMS(Dalvik Debug Monitoring Service)를 이용해 쉽게 로그를 확인할 수 있다.
아래와 같이 1번의 DDMS(Dalvik Debug Monitoring Service)을 선택하자.
2번에서 로그를 보고 싶은 디바이스를 선택한다.
3번에서 LogCat 항목을 선택하면
4번과 같이 로그가 출력된 화면이 보인다.
아래와 같이 Log라고 작성한 String 내용이 색상별로 출력되었다.
이전에 소스를 작성한 부분으로 잠시 돌아가 보자.
Log.v(TAG, ......);
Log.d(TAG, ......);
Log.i(TAG, ......);
Log.w(TAG, ......);
Log.e(TAG, ......);
로그를 출력하는 첫번째 인자에 TAG라는 문자열을 적어 주었다.
무엇을 의미하는 것일까?
아래를 보자.
1번에 "+" 버튼을 누르고
Log Filter라는 창이 뜨면 2번,3번과 같이 입력하라.
이제 다시 DDMS의 LogCat 항목을 보면 이해가 될 것이다.
이전에는 디바이스에 모든 로그가 보였으나,
1번과 같이 "LogCatTest" 탭이 생기고 (바로 이전에 입력한 "Filter Name"에 해당)
그 탭에는 Tag에 입력한 문자열로 Filtering 되어 보여진다. (바로 이전에 입력한 "by Log Tag"에 해당)
훨씬 보기 편하지 않은가?
이 것은 Log Filter 기능이다.
자신이 원하는 로그만을 보기 위한 기능인 것이다.
자 이제 다른 방법으로 Filtering해 보자.
아래에서 1번과 같이 로그를 출력한 Process ID를 기억하고
똑 같이 "+" 버튼을 눌러보자.
이번에는 4번과 같이 이전에 기억한 Process ID를 입력하자.
이번에는 Pid로 filtering 되었다.
이렇게 특정 PID를 이용해서 해당 process가 어떤 상태인지 확인할 수 있다.
추가한 Filer를 수정할 수도 있다.
아래와 같이 1번을 선택(Edit Filter)하여 등록된 Filter 정보를 수정할 수 있다.
추가된 필터를 삭제할 수도 있다.
아래의 1번(Delete Filter)을 선택하여 삭제해 보자.
출력된 모든 로그를 지울 수도 있다.
1번(Clear Log)을 선택하면 모든 로그가 지워진다.
자 이번에는 로그의 Priority Level로 필터링 해 보자.
다시 이전에 로그를 출력하기 위한 소스를 기억해 보자.
Log.v(... , ...);
Log.d(... , ...);
Log.i(... , ...);
Log.w(... , ...);
Log.e(... , ...);
v,d,i,w,e 로 로그가 구별이 되는데 이것을 무엇을 의미하는 것일까?
바로 이것이 로그의 Priority Level이다.
즉 로그의 중요도인 것이다.
v ==> Verbose (다양한 정보를 출력하기 위한 Level)
d ==>Debug (문제 발생시 문제 발생된 원인을 디버깅 하기 위한 상태 로그 Level)
i ==> Info (각종 클래스,변수의 정보나, 프로그램의 상태 정보를 출력하기 위한 로그 Level)
w ==> Warning (프로그램의 상태에 문제가 발생할 소지가 있는 부분을 알리기 위한 경고 로그 Level)
e ==> Error (프로그램의 치명적인 문제 발생을 알리는 로그 Level)
위의 로그에 대한 일반적인 설명을 달았으나,
사용 용도는 개발자의 마음대로 이다.
해당 Log Level에 따라 색상별로 구분이 편하게 출력된다.
자 Log Level에 따른 필터링 방법을 아래에서 이해하자.
아래와 같이 1번 "V" (Verbose)버튼을 눌러보자.
필터링 되지 않고 모든 로그가 보일 것이다.
그 이유는 아래와 같다.
각 Log Level은 포함 관계를 가진다.
Verbose는 아래를 모두 포함함으로 모든 Level 로그가 출력되는 것이다.
아래를 보자.
"D"를 선택하면 포함 관계에서 "V"는 빠짐으로써 verbose를 제외한 로그가 다 보이는 것이다.
아래는 Info 필터이다.
아래는 Warning 필터이다.
아래는 Error 필터이다.
특정 문자열을 입력하여 로그를 Filtering할 수 있다.
아래와 같이 Filter 입력창에 Filtering하고 싶은 문자열을 넣게 되면
모든 로그의 내용중 해당 문자열이 포함된 내용면 화면에 출력된다.
필터링 대상의 문자열은 Message의 내용이다.
해당 내용을 지우면 모든 로그가 다시 나온다.
해당 메시지 내용은 어떻게 출력되었을까?
이전에 로그를 출력하기 위해 입력했던 소스를 생각해 보자.
Log.i ( TAG, "문자열" )
위처럼 바로 "문자열"에 적어 주었던 내용이 Message에 해당한다.
Log에 대해서 정리해 보자면,
해당 로그 정보를 이용하면 다양한 정보를 얻을 수 있었다.
로그를 출력한 시간, Level, 로그가 출력된 Process ID 등...
특히 로그 출력시간을 이용해서 해당 함수의 처리 시간을 알 수 있다.
이는 함수에 대한 성능 측정에도 이용이된다.
Logcat은 문제 발생시 가장 간단히 디버깅 할 수 있는 도구이다.
Log를 충분히 추가하여 디버깅 시간을 줄이도록 하자.
(하지만 For문과 같이 비번히 호출되는 곳에 로그를 남기는 것은
배제하자. 너무 많은 로그를 남기면 로그 분석 시간이 많이 소모된다.
뿐만아니라 로그를 저장하는 것 또한 한계가 있다.
남긴 모든 로그가 저장되는 것이 아니다. 내부적으로 로그 buffer 가 존재하며,
그 buffer 이상 로그를 저장하면 제일 오래된 로그 부터 삭제 된다.
즉 최근 로그만 유지하는 것이다.)
1.2 ADB 상에서 Logcat 이용하기
늘 Eclipse가 구동될 수 있는 환경이 아닐때도 많을 것이다.
Eclipse를 통해 DDMS를 구동시킬 수 없는 경우
간단한 command 창에서 adb 툴을 이용해서 로그를 확인 할 수도 있다.
Android SDK를 설치하면 ADB.exe가 존재한다.
나의 경우는 경로가 아래와 같다.
해당 명령어는 Command창 환경에서 사용해야 한다.
아래와 같이 "Windows키 + R"을 눌러서
"cmd"라고 입력한뒤 확인을 선택하면 command창이 구동된다.
ADB.exe 명령어를 실행하기 위해 해당 폴더로 이동해야 한다.
그런데 adb.exe를 실행하기 위해 늘 해당 폴더로 이동하는 것은 불편하다.
그러므로 해당 adb.exe 폴더를 환경 변수에 PATH 등록을 하게 되면
해당 폴더 이동을 할 필요가 없다.
아래는 adb.exe가 존재하는 폴더에 대한 PATH 등록 설정을 하는 방법이다.
"제어판"을 실행하고 2번과 같이 "시스템 보안"을 선택하자.
(Windows 7의 경우이다.)
시스템을 선택하자.
설정 변경을 선택하자.
시스템 속성 창이 구동되면 "고급" 탭을 누르고 "환경 변수"를 선택하자.
환경 변수 창이 구동되면
1번과 같이 "Path" 변수를 찾아서 선택하고
2번과 같이 "편집" 버튼을 누르자.
아래와 같이 시스템 변수 편집창이 뜨면
1번 Edit에서 제일 마지막 줄에 이전에 adb.exe가 있는 폴더 Path를
3번과 같이 넣어주다.
(꼭 경로 앞에 ";"을 넣어 주어야 한다.)
이제 경로 변경 없이 adb.exe를 사용할 수 있다.
자 이제 command창을 열어서 아래와 같이 입력해 보자.
| \ adb shell logcat |
보기는 힘들어도 정상적으로 로그가 출력된 것을 볼 수 있다.
로그 내용중 내가 추가한 로그의 내용도 볼수 있다.
하지만 이상하게도 시간 정보가 나오지 않았다.
시간 정보는 아래와 같이 특정한 옵션이 필요하다.
| \ adb shell logcat -v time |
시간 정보가 출력되었다.
자 "adb shell logcat -v time" 이라고 실행하면
해당 명령이 종료 되지 않고 아래와 같이 멈춰 있을 것이다.
이유는 다른 Log가 출력되기를 기다리고 있는 것이다.
"Ctrl-C"를 누르면 종료되나
특정 옵션으로 출력됨과 동시에 종료할 수도 있다.
| \ adb shell logcat -v time -d |
정상 종료 된 것을 볼 수 있다.
이전에 Filtering에 대해서 배웠다.
이번에는 TAG를 이용해 Filtering 을 배워 보겠다.
| \ adb shell logcat -v time -d -s LogCatTest:v |
설명을 더하자면 -s 옵션을 주고 <tag 명>:<Log Level> 을 입력하면된다.
해당 Tag로 출력된 것을 볼 수 있다.
이번에는 Log Level로 filtering해 보자.
이전과 속성은 같다.
| \ adb shell logcat -v time -d -s LogCatTest:v |
v ==> Verbose
d ==>Debug
i ==> Info
w ==> Warning
e ==> Error
원하는 결과를 얻었다.
자 이번에는 모든 로그를 지워 보자.
| \ adb shell logcat -c |
이번에는 화면에 출력되는 로그의 내용을 파일로 저장해 보자.
| \ adb shell logcat -v time -d > "저장할 파일명" |
로그의 내용은 방대함으로
위와 같이 파일로 저장해서 보는 것이 좋다.
로그만이 살길이다.
로그 추가에 귀찮아 하지 말자. 차후 문제 발생시
로그는 아주 큰 도움을 준다. ^^
!!! 위의 주제에 해당하는 적당한 예를 댓글로 남겨 주세요. ^^
활용 방안의 예는 다른 개발자들에게 많은 도움이 됩니다.
!!! 카페의 활성화를 위해 추천 버튼을 눌러 주세요.
댓글
댓글 리스트-
답댓글 작성자슈퍼성근 작성자 본인 여부 작성자 작성시간 14.07.29 ^^ 너무 늦게 봤네요. 네 없습니다.
하지만 특정 뷰어를 이용하면 색상별로 볼 수 있습니다.
그냥 DOS의 command만을 말씀하시는 것이라면 없습니다. -
작성자중력우울 작성시간 14.07.29 문제는 활용방법을 모르겠군요. 일단 "있다"만 알아두고 가야할 듯;;;
-
답댓글 작성자슈퍼성근 작성자 본인 여부 작성자 작성시간 14.07.29 아 logcat을 어떤 경우에 써야하는지 모른다는 말씀이시죠.
소스상 특정 흐름이 실행되었는지 확인하거나,
특정 변수의 값에 무엇이 들어가 있는지 runtime 상황에서 확인하기 위해 사용됩니다.
즉 디버깅 용도죠.
당장 모르셔도 문제가 되지 않습니다.
앞으로 너무 자연스럽게 필요로하게 될 것이니까요.
-
답댓글 작성자중력우울 작성시간 14.07.31 슈퍼성근 답변 감사합니다.
-
작성자droy 작성시간 15.05.10 자세한 설명에 감사드립니다