Android의 내 응용 프로그램에서 보낸 메시지 만 가져 오려면 LogCat을 필터링 하시겠습니까?
Android 용 ADT와 함께 Eclipse와 함께 Logcat을 사용하면 다른 많은 응용 프로그램에서도 메시지를 볼 수 있습니다. 이것을 필터링하고 내 응용 프로그램의 메시지 만 표시하는 방법이 있습니까?
패키지 이름은 고유하므로 태그와 함께 함수를 패키지 이름으로 사용하고 패키지 이름으로 필터링 할 수 있습니다Log
.
참고 : 빌드 도구 21.0.3부터 TAGS가 23 자 이하로 제한되어 더 이상 작동하지 않습니다.
Log.<log level>("<your package name>", "message");
adb -d logcat <your package name>:<log level> *:S
-d
는 실제 장치를 -e
나타내며 에뮬레이터를 나타냅니다. 있다면 당신이 사용할 수있는 실행 1 개 이상 에뮬레이터 -s emulator-<emulator number>
(예 -s emulator-5558
)
예: adb -d logcat com.example.example:I *:S
또는 System.out.print
메시지를 로그에 보내는 데 사용 하는 경우 adb -d logcat System.out:I *:S
System.out에 대한 호출 만 표시 하는 데 사용할 수 있습니다 .
https://developer.android.com/studio/command-line/logcat.html 에서 모든 로그 수준과 자세한 정보를 찾을 수 있습니다.
http://developer.android.com/reference/android/util/Log.html
편집 : 나는 총을 약간 뛰어 넘고 Eclipse에서 logcat에 대해 묻는다는 것을 깨달았습니다. 위에서 게시 한 것은 명령 줄에서 adb를 통해 logcat을 사용하는 것입니다. 동일한 필터가 Eclipse로 전송되는지 확실하지 않습니다.
리눅스와 OS X
ps / grep / cut을 사용하여 PID를 잡고 해당 PID가있는 logcat 항목을 grep하십시오. 내가 사용하는 명령은 다음과 같습니다.
adb logcat | grep -F "`adb shell ps | grep com.asanayoga.asanarebel | tr -s [:space:] ' ' | cut -d' ' -f2`"
(동일한 숫자를 포함하는 관련없는 로그 라인의 이론적 문제를 피하기 위해 정규식을 더 향상시킬 수는 있지만 결코 문제가되지 않았습니다)
여러 프로세스를 일치시킬 때도 작동합니다.
윈도우
Windows에서는 다음을 수행 할 수 있습니다.
adb logcat | findstr com.example.package
필터 추가
이름을 지정하십시오
필터를 선택하십시오.
Android 7.0부터 logcat에는 --pid 필터 옵션이 있으며 pidof 명령을 사용할 수 있으므로 com.example.app을 패키지 이름으로 바꾸십시오.
(우분투 단말기 / Android 7.0부터)
adb logcat --pid=`adb shell pidof -s com.example.app`
또는
adb logcat --pid=$(adb shell pidof -s com.example.app)
pidof 명령에 대한 자세한 내용은
https://stackoverflow.com/a/15622698/7651532
나를 위해 이것은 Mac에서 작동 Terminal
합니다. adb
다음 터미널에 아래 명령을 입력 한 폴더로 이동하십시오.
./adb logcat MyTAG:V AndroidRuntime:E *:S
여기에서 모든 로그를 필터링 MyTAG
하고AndroidRuntime
5 월 17 일 업데이트
몇 년이 지났고 일이 바뀌 었습니다. 그리고 Eclipse는 더 이상 공식적으로 지원되지 않습니다. 따라서 여기에는 두 가지 최신 접근 방식이 있습니다.
1. 안드로이드 스튜디오
에서 Android monitor
도구 상자, 당신은 로그 캣의 당을 필터링 할 수 있습니다 debuggable process
. 일반적으로 응용 프로그램을 개발할 때는 디버깅 가능한 프로세스입니다. 가끔씩 나는 이것에 문제가 있으며 다음을 수행하십시오.
Tools
->Android
->Enable ADB Integration
.
이미 활성화되어 있으면 끄고 다시 켭니다.모바일 장치를 분리했다가 다시 연결하십시오.
정규식과 디버그 수준을 통해 필터링하는 옵션도 있습니다
2. 로그 캣 색상
adb logcat
터미널 기반 솔루션을 사용하려는 경우 멋진 파이썬 래퍼입니다 . 그것에 대한 좋은 점은 여러 구성을 저장하고 간단히 재사용 할 수 있다는 것입니다. 필터링 기준 tags
은 매우 안정적입니다. 필터링하여 package
하나 이상의 앱 로그 만 볼 수 있지만 앱을 시작 logcat-color
하기 직전에 시작합니다.
기존 답변 :
이전 답변에 댓글을 달 수 없으므로 새 답변을 게시 할 것입니다. 이것은 PID Mulcahy 의 답변에 대한 주석 이며 adb shell ps
PID 열은 가변적 이므로 대부분의 장치에서 작동하도록 명령이 어떻게 변경되어야하는지 보여줍니다 .
참고 : 아래 명령은 많은 장치를 연결 한 경우에 작동합니다. 그래서 device id
필요합니다. 그렇지 않으면 괄호 '[', ']'를 생략하면됩니다.
1. pid 열을 찾으려면 다음을 입력하십시오.
adb [-s DEVICE_ID] shell ps | head -n 1
이제 PID의 열 번호를 기억하십시오. 번호 매기기는에서 시작합니다 1
.
그런 다음 다음을 입력하십시오.
adb [-s DEVICE_ID] logcat | grep $(adb [-s DEVICE_ID] shell ps \
| grep "com.example" | awk -F" " ' {print $PUT_COLUMN_HERE}')
PUT_COLUMN_HERE
예를 들어 기억 한 열을 입력하십시오.$5
경고
응용 프로그램이 OS에서 새 PID를 가져 오기 때문에 응용 프로그램을 다시 실행할 때마다 두 번째 명령을 다시 실행해야합니다.
이것은 git bash에서 나를 위해 일하고있다 :
$ pid=$(adb shell ps | grep <package name> | cut -c11-15) ; adb logcat | grep $pid
이것을 applog.sh에 넣으십시오.
#!/bin/sh
PACKAGE=$1
APPPID=`adb -d shell ps | grep "${PACKAGE}" | cut -c10-15 | sed -e 's/ //g'`
adb -d logcat -v long \
| tr -d '\r' | sed -e '/^\[.*\]/ {N; s/\n/ /}' | grep -v '^$' \
| grep " ${APPPID}:"
그때: applog.sh com.example.my.package
Android Studio 를 사용하는 경우 로그 캣을 수신 할 프로세스를 선택할 수 있습니다. 스크린 샷입니다.
패키지 이름으로 logcat을 필터링하기위한 쉘 스크립트를 작성했습니다.
ps | grep com.example.package | cut -c10-15
/ proc / $ pid / cmdline을 사용하여 실제 pid를 찾은 다음 logcat에서 grep을 수행합니다.
https://gist.github.com/kevinxucs/7340e1b1dd2239a2b04a
Eclipse 용 ADT v15를 사용하면 애플리케이션 이름 (실제로 androidmanifest.xml의 패키지 값)을 지정할 수 있습니다.
앱별로 필터링 할 수는 있지만 새로운 logcat에는 자동 스크롤에 버그가 있습니다. 이전 로그를보기 위해 약간 위로 스크롤하면 몇 초 후에 자동으로 맨 아래로 다시 스크롤됩니다. 로그를 1/2 위로 올리면 로그가 맨 아래로 돌아 가지 못하게되지만 종종 쓸모가 없습니다.
편집 : 명령 줄에서 앱 필터를 지정하려고했지만 운이 없습니다. 누군가 이것을 알아 내거나 자동 스크롤을 멈추는 방법을 알려주세요.
Windows 명령 프롬프트 사용 : adb logcat -d | findstr <package>
.
* 이것은 jj_ 에 의해 처음 언급 되었지만 주석에서 그것을 찾는 데 오랜 시간이 걸렸습니다 ...
이것은 USB 디버깅에서 저에게 효과적입니다.
장치를 연결하고 다음을 사용하십시오.
adb shell
logcat을 간단하게 사용하십시오.
logcat | grep com.youapp.packagename
우분투 : adb logcat -b all -v color --pid =`adb shell pidof -s com.packagename` 앱의 색상과 연속 로그
앱과 관련된 시스템 메시지 만 볼 수있는 방법이 확실하지 않지만 문자열을 기준으로 필터링 할 수 있습니다. 프로그램 내에서 로그를 작성하는 경우 특정 고유 키워드를 포함시키고 해당 단어를 기준으로 필터링하면됩니다.
logcat 내부의 필터를 사용하십시오. 필터를 추가 할 수있는 버튼이 있습니다. 응용 프로그램 ID를 지정하고 나중에 선택했는지 확인하면 완료됩니다.
시도 : 창-> 환경 설정-> Android-> LogCat. "..."이면 "로그 캣보기 표시"필드를 "VERBOSE"로 변경하십시오. 그것은 나를 도왔다.
Eclipse 를 사용하는 경우 아래 logCat 창 에서 녹색 + 기호 를 누르고 애플리케이션 이름 상자 에 패키지 이름 (com.example.yourappname)을 입력하십시오 . 또한 필터 이름 상자 에서 원하는 이름을 선택 하고 확인을 클릭하십시오. 방금 추가 한 필터를 logCat의 왼쪽 창에서 선택하면 응용 프로그램과 관련된 메시지 만 표시됩니다.
로그 이름을 지정하십시오. 나는 "wawa"라고 불렀다.
Android Studio에서 Android-> 필터 구성 편집으로 이동하십시오.
그런 다음 로그에 지정한 이름을 입력하십시오. 제 경우에는 "wawa"라고합니다. 다음은 수행 할 수있는 필터 유형의 예입니다. System.out, System.err, 로그 또는 패키지 이름으로 필터링 할 수 있습니다.
On Windows 10, using Ionic, what worked great to me was combine 'findstr' with the "INFO:CONSOLE" generated by all App messages. So, my command in command line is:
adb logcat | findstr INFO:CONSOLE
As a variant you can use third party script PID Cat by Jake Wharton. This script has two major advantages:
- shows log entries for processes from a specific application package
- color logcat
From documentation:
During application development you often want to only display log messages coming from your app. Unfortunately, because the process ID changes every time you deploy to the phone it becomes a challenge to grep for the right thing.
This script solves that problem by filtering by application package.
I tried to use Tom Mulcahy's answer but unfortunately it was not working for applications with multiple processes so I edit it to fit my needs.
#!/bin/bash
if [ "$#" -ne 1 ]; then echo "Illegal number of parameters"; exit 1; fi
echo "Lof for package name: $1"
PROCESSES=`adb shell ps | grep "$1" | cut -c10-15`
NUM_OF_PROCESSES=`echo "$PROCESSES" | wc -l`
if [ $NUM_OF_PROCESSES -eq 0 ]; then echo "The application is not running!"; exit 1; fi
COUNTER=1
for process in $PROCESSES; do
if [ $COUNTER -eq 1 ]; then GREP_TEXT="("; fi
GREP_TEXT+=$process
if [ $COUNTER -eq $NUM_OF_PROCESSES ]; then GREP_TEXT+=")"; else GREP_TEXT+="|"; fi
let COUNTER=COUNTER+1
if [ $COUNTER -gt $NUM_OF_PROCESSES ]; then break; fi
done
adb logcat | grep -E "$GREP_TEXT"
This is probably the simplest solution.
On top of a solution from Tom Mulcahy, you can further simplify it like below:
alias logcat="adb logcat | grep `adb shell ps | egrep '\bcom.your.package.name\b' | cut -c10-15`"
Usage is easy as normal alias. Just type the command in your shell:
logcat
The alias setup makes it handy. And the regex makes it robust for multi-process apps, assuming you care about the main process only.
Of coz you can set more aliases for each process as you please. Or use hegazy's solution. :)
In addition, if you want to set logging levels, it is
alias logcat-w="adb logcat *:W | grep `adb shell ps | egrep '\bcom.your.package.name\b' | cut -c10-15`"
Use -s
!
You should use your own tag, look at: http://developer.android.com/reference/android/util/Log.html
Like.
Log.d("AlexeysActivity","what you want to log");
And then when you want to read the log use>
adb logcat -s AlexeysActivity
That filters out everything that doesn't use the same tag.
In addition to Tom Mulcahy's answer, if you want to filter by PID on Windows' console, you can create a little batch file like that:
@ECHO OFF
:: find the process id of our app (2nd token)
FOR /F "tokens=1-2" %%A IN ('adb shell ps ^| findstr com.example.my.package') DO SET PID=%%B
:: run logcat and filter the output by PID
adb logcat | findstr %PID%
This is obviously a question aimed at usage of Logcat from outside of the developer device, however if you want to display Logcat output on the device (programmatically), you just need this:
Runtime.getRuntime().exec("logcat " + android.os.Process.myPid() + " *:D");
The *:D
at the end filters out every message below Debug log level but you can leave that out.
To direct the output to, say, a TextView, see for example here.
Now is possible to type tag:nameofthetag or app:nameoftheapp to filter without adding new filters to the saved filters bar
intelliJ (및 아마도 일식에서도)는 텍스트 webview로 logcat 출력을 필터링 할 수 있으므로 기본적으로 phonegap이 생성하는 모든 것을 인쇄합니다
applog.sh
여러 프로세스가있는 여러 장치 및 응용 프로그램을 지원 하는 가브리엘의 또 다른 변형 :
#!/bin/sh
PKG=$1
shift
APPIDS=`adb $@ shell ps | awk -v PKG="$PKG" '
(NR == 1){appcolumn=2; for (i=1; i<=NF; i++) if ($i=="PID") {appcolumn=i}}
index($0,PKG){print $(appcolumn)}' | paste -d \| -s`
echo "PID's: $APPIDS"
adb $@ logcat -v color | awk "(\$3 ~ /$APPIDS/){print \$0}"
용법: applog.sh com.example.my.package [-s <specific device>]
리눅스에서 이것은 나를 위해 일했습니다 :
adb logcat | grep `adb shell ps | grep your.package | awk '{print $2}'`
'Programing' 카테고리의 다른 글
Eclipse 프로젝트에서 javax.servlet API를 가져 오려면 어떻게합니까? (0) | 2020.03.10 |
---|---|
SSL / TLS 보안 채널 (SOAP)에 대한 신뢰 관계를 설정할 수 없습니다. (0) | 2020.03.10 |
ArrayList를 되 돌리는 가장 간단한 방법은 무엇입니까? (0) | 2020.03.10 |
모든 서브 뷰를 제거 하시겠습니까? (0) | 2020.03.10 |
PID 대신 이름으로 프로세스를 종료하려면 어떻게해야합니까? (0) | 2020.03.09 |