Tôi quan sát thấy rằng khi tôi sử dụng Logcat với Eclipse với ADT cho Android, tôi cũng nhận được tin nhắn từ nhiều ứng dụng khác. Có cách nào để lọc cái này và chỉ hiển thị các tin nhắn từ ứng dụng của riêng tôi mà thôi.
Tôi quan sát thấy rằng khi tôi sử dụng Logcat với Eclipse với ADT cho Android, tôi cũng nhận được tin nhắn từ nhiều ứng dụng khác. Có cách nào để lọc cái này và chỉ hiển thị các tin nhắn từ ứng dụng của riêng tôi mà thôi.
Câu trả lời:
Tên gói được đảm bảo là duy nhất để bạn có thể sử dụng Log
chức năng với thẻ làm tên gói của mình và sau đó lọc theo tên gói :
LƯU Ý: Kể từ Công cụ xây dựng 21.0.3, điều này sẽ không còn hoạt động vì TAGS bị giới hạn ở 23 ký tự trở xuống.
Log.<log level>("<your package name>", "message");
adb -d logcat <your package name>:<log level> *:S
-d
biểu thị một thiết bị thực tế và -e
biểu thị một trình giả lập. Nếu có nhiều hơn 1 trình giả lập đang chạy, bạn có thể sử dụng -s emulator-<emulator number>
(ví dụ -s emulator-5558
:)
Thí dụ: adb -d logcat com.example.example:I *:S
Hoặc nếu bạn đang sử dụng System.out.print
để gửi tin nhắn đến nhật ký, bạn có thể sử dụng adb -d logcat System.out:I *:S
để chỉ hiển thị các cuộc gọi đến System.out.
Bạn có thể tìm thấy tất cả các cấp độ nhật ký và thông tin thêm ở đây: https://developer.android.com/studio/command-line/logcat.html
http://developer.android.com/reference/android/util/Log.html
EDIT: Có vẻ như tôi đã nhảy súng một chút và nhận ra rằng bạn đang hỏi về logcat trong Eclipse. Những gì tôi đã đăng ở trên là để sử dụng logcat thông qua adb từ dòng lệnh. Tôi không chắc chắn nếu các bộ lọc tương tự chuyển qua Eclipse.
logcat <your package name>:<log level>
câu trả lời cho thấy có thể sử dụng tên gói làm bộ lọc hợp lệ. Tôi cần đọc câu trả lời hai lần để hiểu những gì nó thực sự nói, do đó tôi khuyên bạn chỉ nên thay đổi dòng đầu tiên thành một cái gì đó như " logcat <tag>:<log level>
nơi <tag>
có thể là tên gói của bạn nếu bạn cũng sử dụng làm thẻ trong android.util.Log
"
Sử dụng ps / grep / cut để lấy PID, sau đó grep cho các mục logcat với PID đó. Đây là lệnh tôi sử dụng:
adb logcat | grep -F "`adb shell ps | grep com.asanayoga.asanarebel | tr -s [:space:] ' ' | cut -d' ' -f2`"
(Bạn có thể cải thiện regex hơn nữa để tránh vấn đề lý thuyết về các dòng nhật ký không liên quan có cùng số, nhưng nó không bao giờ là vấn đề đối với tôi)
Điều này cũng hoạt động khi phù hợp với nhiều quá trình.
Trên Windows bạn có thể làm:
adb logcat | findstr com.example.package
pid=$(adb shell ps | grep "package-name" | cut -c10-15) && adb logcat | grep $pid
adb logcat | grep `adb shell ps | grep org.videolan.vlc | awk '{print $2")"}'`
adb logcat | findstr com.example.package
adb logcat | grep `adb shell ps | grep com.example.package | tr -s [:space:] ' ' | cut -d' ' -f2`
Kể từ Android 7.0, logcat có tùy chọn bộ lọc --pid và lệnh pidof khả dụng, thay thế com.example.app vào tên gói của bạn.
(thiết bị đầu cuối Ubuntu / Kể từ Android 7.0)
adb logcat --pid=`adb shell pidof -s com.example.app`
hoặc là
adb logcat --pid=$(adb shell pidof -s com.example.app)
Để biết thêm thông tin về lệnh pidof:
https://stackoverflow.com/a/15622698/7651532
grep
và findstr
, nhưng chúng chỉ lọc các bản ghi với một số giá trị không bao gồm nhiều thông báo. Câu trả lời của bạn là thật, hiển thị tất cả nhật ký về ứng dụng mà không loại trừ thông điệp tường trình từ các thư viện khác. Nó giống như bộ lọc hiện tại của Android Studio 'Chỉ hiển thị được chọn'. Cảm ơn!
Thêm bộ lọc
Chỉ định tên
Chọn bộ lọc của bạn.
Đối với tôi, nó hoạt động trong mac Đã Terminal
đến thư mục mà bạn có adb
sau đó gõ lệnh bên dưới trong terminal
./adb logcat MyTAG:V AndroidRuntime:E *:S
Ở đây nó sẽ lọc tất cả các bản ghi của MyTAG
vàAndroidRuntime
Log.d("MyTAG", "i am hero"); Log.d("AndroidRunTime", "i am zero");
2) để DEBUG đăng nhập vào Android $ adb -s RKSCWSOV5SAIEUSC shell;
3) $ logcat MyTAG:V AndroidRuntime:E *:S
4) bây giờ, nó sẽ hiển thị dài dòng MyTAG và các lỗi của AndroidR.78
Đã một vài năm, và mọi thứ đã thay đổi. Và Eclipse không còn được hỗ trợ chính thức. Vì vậy, đây là hai cách tiếp cận cập nhật hơn:
Trong Android monitor
hộp công cụ, bạn có thể lọc logcat mỗi debuggable process
. Thông thường, khi bạn phát triển một ứng dụng, đó là một quá trình có thể sửa lỗi. Thỉnh thoảng tôi gặp vấn đề với điều này, và làm như sau:
Tools
-> Android
-> Enable ADB Integration
.
Nếu nó đã được kích hoạt, sau đó tắt nó đi, và sau đó bật lại
Rút phích cắm và cắm lại thiết bị di động của bạn.
Ngoài ra còn có các tùy chọn để lọc qua regex và mức độ gỡ lỗi
Đây là một trình bao bọc python đẹp ở trên adb logcat
nếu bạn muốn sử dụng một giải pháp dựa trên thiết bị đầu cuối. Điều tốt về nó là bạn có thể lưu nhiều cấu hình và chỉ cần sử dụng lại chúng. Lọc theo tags
là khá đáng tin cậy. Bạn cũng có thể lọc theo package
để xem nhật ký của một hoặc nhiều ứng dụng, nhưng bạn bắt đầu logcat-color
ngay trước khi khởi chạy ứng dụng của mình.
Có vẻ như tôi không thể nhận xét các câu trả lời trước đó, vì vậy tôi sẽ đăng một câu hỏi mới. Đây là một nhận xét cho câu trả lời của Tom Mulcahy , cho thấy lệnh sẽ thay đổi như thế nào để hoạt động trên hầu hết các thiết bị, vì adb shell ps
cột PID là biến.
LƯU Ý: Lệnh bên dưới hoạt động cho các trường hợp bạn đã kết nối nhiều thiết bị. Vì vậy, device id
là cần thiết. Mặt khác, bạn chỉ có thể bỏ qua dấu ngoặc '[', ']'
1. Để tìm ra cột của pid, gõ:
adb [-s DEVICE_ID] shell ps | head -n 1
Bây giờ ghi nhớ số cột cho PID. Đánh số bắt đầu từ 1
.
2. Sau đó gõ như sau:
adb [-s DEVICE_ID] logcat | grep $(adb [-s DEVICE_ID] shell ps \
| grep "com.example" | awk -F" " ' {print $PUT_COLUMN_HERE}')
Chỉ cần đặt cột bạn đã ghi nhớ vào PUT_COLUMN_HERE
, vd$5
Mỗi lần bạn chạy lại ứng dụng của mình, bạn phải chạy lại lệnh thứ 2, vì ứng dụng sẽ nhận được một bộ vi xử lý mới từ HĐH.
đặt cái này vào 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}:"
sau đó:
applog.sh com.example.my.package
log.d("TAG", "multine\nlog")
ví dụ: nếu bạn đã thực hiện ): adb -d logcat -v long | sed -Ene '/^\[.*'" (${APPID}):"'.*\]/ { N; s/\n/ /; p; :a;' -e 'n; p; s/^.+$/foo/; t a;' -e ' }' | grep -v '^$'
- Tôi đã bỏ qua tr
, tôi cho rằng nó cần thiết trên các hệ thống Windows và tôi đã gói APPID
trong ngoặc đơn để cho phép các midsitple (cách nhau bởi |
) .
Điều này hoạt động với tôi với gỡ lỗi USB:
Kết nối thiết bị và sử dụng:
adb shell
Sử dụng logcat khi được kết nối:
logcat | grep com.yourapp.packagename
Nếu bạn đang sử dụng Android Studio, bạn có thể chọn quy trình mà bạn muốn nhận logcats. Đây là ảnh chụp màn hình.
Log cat has a new option (on by default) which creates an application filter automatically such that only the launched application's output is shown
Tôi đã viết một kịch bản shell để lọc logcat theo tên gói, mà tôi nghĩ là đáng tin cậy hơn so với sử dụng
ps | grep com.example.package | cut -c10-15
Nó sử dụng / Proc / $ pid / cmdline để tìm ra pid thực tế, sau đó thực hiện một grep trên logcat
ADT v15 cho Eclipse cho phép bạn chỉ định một tên ứng dụng (thực sự là giá trị gói trong androidmanifest.xml của bạn).
Tôi thích có thể lọc theo ứng dụng, nhưng logcat mới có lỗi với autoscroll. Khi bạn cuộn lên một chút để xem các bản ghi trước đó, nó sẽ tự động cuộn trở lại xuống dưới trong vài giây. Có vẻ như cuộn 1/2 cách lên khúc gỗ sẽ khiến nó không nhảy xuống đáy, nhưng điều đó thường vô dụng.
EDIT: Tôi đã thử chỉ định bộ lọc ứng dụng từ dòng lệnh - nhưng không gặp may. Nếu ai đó chỉ ra điều này HOẶC làm thế nào để dừng autoscroll, vui lòng cho tôi biết.
Ubuntu: adb logcat -b all -v color --pid = `adb shell pidof -s com.packagename` Với màu sắc và nhật ký liên tục của ứng dụng
adb shell pidof ...
chút không làm việc cho tôi vì vậy tôi adb shell
ed vào thiết bị và chạy top
sao chép PID cho ứng dụng của tôi ở đó và sau đó thay thế nó trong lệnh của bạn
pgrep
thay vì pidof
Là một biến thể, bạn có thể sử dụng tập lệnh bên thứ ba PID Cat của Jake Wharton. Kịch bản này có hai ưu điểm chính:
Từ tài liệu:
Trong quá trình phát triển ứng dụng, bạn thường chỉ muốn hiển thị các thông điệp tường trình đến từ ứng dụng của mình. Thật không may, vì ID tiến trình thay đổi mỗi khi bạn triển khai vào điện thoại, nó trở thành một thách thức đối với điều đúng đắn.
Kịch bản lệnh này giải quyết vấn đề đó bằng cách lọc theo gói ứng dụng.
Thử: Cửa sổ -> Tùy chọn -> Android -> LogCat. Thay đổi trường "Hiển thị chế độ xem logcat nếu ..." giá trị "XÁC MINH". Nó đã giúp đỡ tôi.
Nếu bạn đang sử dụng Eclipse , hãy nhấn dấu + màu xanh lục trong cửa sổ logCat bên dưới và đặt tên gói của bạn (com.example.yourappname) vào hộp Tên ứng dụng . Ngoài ra, chọn bất kỳ tên nào phù hợp với bạn trong hộp Tên bộ lọc và nhấp vào ok. Bạn sẽ chỉ thấy các thông báo liên quan đến ứng dụng của mình khi bộ lọc bạn vừa thêm được chọn từ khung bên trái trong logCat.
Đặt tên cho nhật ký của bạn. Tôi gọi tôi là "wawa".
Trong Android Studio, đi tới Android-> Chỉnh sửa cấu hình bộ lọc
Sau đó nhập tên bạn đã đưa ra nhật ký. Trong trường hợp của tôi, nó được gọi là "wawa". Dưới đây là một số ví dụ về các loại bộ lọc bạn có thể làm. Bạn có thể lọc theo System.out, System.err, Logs hoặc tên gói:
Đây có lẽ là giải pháp đơn giản nhất.
Ngoài giải pháp từ Tom Mulcahy, bạn có thể đơn giản hóa hơn nữa như sau:
alias logcat="adb logcat | grep `adb shell ps | egrep '\bcom.your.package.name\b' | cut -c10-15`"
Cách sử dụng dễ dàng như bí danh bình thường. Chỉ cần gõ lệnh trong shell của bạn:
logcat
Các thiết lập bí danh làm cho nó tiện dụng. Và regex làm cho nó mạnh mẽ cho các ứng dụng đa quy trình, giả sử bạn chỉ quan tâm đến quy trình chính.
Vì bạn có thể đặt thêm bí danh cho mỗi quy trình nếu muốn. Hoặc sử dụng giải pháp của bá chủ. :)
Ngoài ra, nếu bạn muốn đặt mức ghi nhật ký, đó là
alias logcat-w="adb logcat *:W | grep `adb shell ps | egrep '\bcom.your.package.name\b' | cut -c10-15`"
Tôi đã cố gắng sử dụng câu trả lời của Tom Mulcahy nhưng tiếc là nó không hoạt động cho các ứng dụng có nhiều quy trình nên tôi chỉnh sửa nó để phù hợp với nhu cầu của mình.
#!/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"
Sử dụng -s
!
Bạn nên sử dụng thẻ của riêng mình, xem tại: http://developer.android.com/reference/android/util/Log.html
Giống.
Log.d("AlexeysActivity","what you want to log");
Và sau đó khi bạn muốn đọc nhật ký sử dụng>
adb logcat -s AlexeysActivity
Điều đó lọc ra mọi thứ không sử dụng cùng một thẻ.
Ngoài câu trả lời của Tom Mulcahy , nếu bạn muốn lọc bằng PID trên bảng điều khiển của Windows, bạn có thể tạo một tệp bó nhỏ như thế:
@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%
Đây rõ ràng là một câu hỏi nhằm mục đích sử dụng Logcat từ bên ngoài thiết bị của nhà phát triển, tuy nhiên nếu bạn muốn hiển thị đầu ra Logcat trên thiết bị (theo chương trình), bạn chỉ cần điều này:
Runtime.getRuntime().exec("logcat " + android.os.Process.myPid() + " *:D");
Các *:D
cuối cùng lọc ra tất cả các thông điệp dưới mực nước ghi gỡ lỗi nhưng bạn có thể để lại mà ra.
Để hướng đầu ra tới, giả sử là TextView, xem ví dụ ở đây .
Bây giờ có thể nhập thẻ: nameofthetag hoặc ứng dụng: nameofth Ứng dụng lại để lọc mà không cần thêm bộ lọc mới vào thanh bộ lọc đã lưu
Trong intelliJ (và có lẽ trong nhật thực cũng vậy), bạn có thể lọc đầu ra logcat bằng cách xem web văn bản , do đó, nó in cơ bản mọi thứ mà phonegap đang tạo ra
Một biến thể khác của Gavriel applog.sh
với sự hỗ trợ của một số thiết bị và ứng dụng với nhiều quy trình:
#!/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}"
Sử dụng: applog.sh com.example.my.package [-s <specific device>]