Lọc LogCat để chỉ nhận các tin nhắn từ Ứng dụng của tôi trong Android?


340

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.


1
Tất cả các câu trả lời đề nghị lọc các tin nhắn từ ứng dụng đang được gỡ lỗi. Ngay cả khi có các bộ lọc này, thư rác Logcat từ các ứng dụng khác sẽ sớm lấp đầy bộ đệm nhật ký cho dù nó có lớn đến đâu. Có cách nào để bảo Eclipse không thu thập các thông báo này hay tiếp tục xóa chúng theo định kỳ?
Giá

Câu trả lời:


267

Tên gói được đảm bảo là duy nhất để bạn có thể sử dụng Logchứ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

-dbiểu thị một thiết bị thực tế và -ebiể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.


10
Tôi biết câu hỏi là về nhật thực, nhưng tôi yêu dòng lệnh và luôn sử dụng nó cho logcat. Đồng thời sử dụng một số công cụ để tô màu đầu ra như jsharkey.org/blog/2009/04/22/ trên làm cho nó thậm chí hữu ích
Francisco Jordano

1
Kiểm tra trên trình giả lập: nó bị kẹt với tôi khi tôi thực hiện adb -e logcat com.example.example: I *: S, adb -d logcat System.out: I *: S đang hoạt động.
CoDe

1
@Shubh Ý bạn là gì? Tôi đã đăng bài này gần một năm trước để một cái gì đó trong Logcat có thể đã thay đổi kể từ đó.
shanet

58
Phương pháp này lọc theo thẻ, không phải theo ứng dụng. Bộ lọc phương pháp của Tom theo ứng dụng
Jonas Alves

17
Bằng cách sử dụng 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"
Flow

367

Linux và OS X

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.

các cửa sổ

Trên Windows bạn có thể làm:

adb logcat | findstr com.example.package

2
@BTRN Nikol: Bạn có thể cài đặt Cygwin hoặc sử dụng git-bash (bash cho windows)
Phillip

1
pid=$(adb shell ps | grep "package-name" | cut -c10-15) && adb logcat | grep $pid
VishalKale

1
somtimes gc in cùng một số với số pid của một tiến trình khi bộ nhớ trống. đây là một phiên bản khácadb logcat | grep `adb shell ps | grep org.videolan.vlc | awk '{print $2")"}'`
alijandro

14
Trên Windows, bạn có thể làm:adb logcat | findstr com.example.package
jj_

8
Chỉ cần một thay đổi nhỏ cho câu trả lời của bạn. Tôi muốn đề nghị:adb logcat | grep `adb shell ps | grep com.example.package | tr -s [:space:] ' ' | cut -d' ' -f2`
hiepnd 27/8/2016

59

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


2
Tôi đã thử tất cả các tùy chọn grepfindstr, 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!
Equiman

Hai lệnh này hoạt động miễn là quá trình "com.example.app" đang chạy. Tuy nhiên, thông báo lỗi sẽ hiển thị nếu quá trình không chạy. Chỉ cần một lưu ý phụ để tránh những điều bất ngờ.
jonathanzh

53

Thêm bộ lọc

Thêm bộ lọc

Chỉ định tên

nhập mô tả hình ảnh ở đây

Chọn bộ lọc của bạn.

nhập mô tả hình ảnh ở đây


3
Điều khá quan trọng là phải chính xác khi bạn thiết kế các công cụ phát triển, vì người dùng mong đợi chính xác. Đó là tên gói, không phải tên ứng dụng. > :(
Henrik Erlandsson

19

Đối với tôi, nó hoạt động trong mac Đã Terminal
đến thư mục mà bạn có adbsau đó 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 MyTAGAndroidRuntime


2
1) Mã Java: 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

1
Đây là câu trả lời duy nhất phù hợp với tôi trên MacOS. Bạn đã làm rất tốt.
om-ha

1
@ om-ha cảm ơn, tôi đã sử dụng Studio từ lâu và không biết rằng nó vẫn có vấn đề
Inder Kumar Rathore

1
Thực tế tôi không sử dụng Android Studio. Tôi đang sử dụng Flutter, Android SDK và Gradle. Là một biên tập viên, Mã VS. Vì vậy, đây là một cách tuyệt vời để biết những gì đang diễn ra trong điện thoại Android của tôi
om-ha

13

Cập nhật ngày 17 tháng 5

Đã 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:

1. Studio Android

nhập mô tả hình ảnh ở đây Trong Android monitorhộ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:

  1. Tools-> Android-> Enable ADB Integration.
    Nếu nó đã được kích hoạt, sau đó tắt nó đi, và sau đó bật lại

  2. 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

2. màu logcat

Đây là một trình bao bọc python đẹp ở trên adb logcatnế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 tagslà 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-colorngay trước khi khởi chạy ứng dụng của mình.

Câu trả lời cũ:

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 pscộ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 idlà 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

Hãy cẩn thận

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.


Nhìn vào tất cả những điều bạn phải làm chỉ để có được nhật ký cho ứng dụng của bạn chứ không phải các ứng dụng khác. Thêm vào đó, tôi thực sự thấy thật nực cười khi người khác có thể nhìn thấy nhật ký của người khác. Bạn đang nói với tôi rằng không có gì Google có thể làm về nó? Chỉ cần đảm bảo rằng nhật ký của tôi không bị người khác nhìn thấy và giữ cho logcat của tôi sạch sẽ?
TatiOverflow

10

Điều này đã làm việc cho tôi trong git bash:

$ pid=$(adb shell ps | grep <package name> | cut -c11-15) ; adb logcat | grep $pid

Có thể sử dụng nó trong mã android?
niko1312

9

đặ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


Đây là một biến thể của bộ lọc để ghi lại các bản ghi đa dòng ( 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 APPIDtrong ngoặc đơn để cho phép các midsitple (cách nhau bởi |) .
Pickup Logan

9

Điều này hoạt động với tôi với gỡ lỗi USB:

  1. Kết nối thiết bị và sử dụng:

    adb shell

  2. Sử dụng logcat khi được kết nối:

    logcat | grep com.yourapp.packagename


7

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.

nhập mô tả hình ảnh ở đây


1
như từ android studio ver 0.4.5 u sẽ nhận được tin nhắn từ ứng dụng chỉ chạy. 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
dmSherazi

7

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

https://gist.github.com/kevinxucs/7340e1b1dd2239a2b04a


6

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.


6

Sử dụng dấu nhắc lệnh của Windows : adb logcat -d | findstr <package>.

* Điều này lần đầu tiên được đề cập bởi jj_ , nhưng tôi phải mất nhiều thời gian để tìm thấy nó trong các bình luận ...


6

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


Các adb shell pidof ...chút không làm việc cho tôi vì vậy tôi adb shelled vào thiết bị và chạy topsao chép PID cho ứng dụng của tôi ở đó và sau đó thay thế nó trong lệnh của bạn
edzillion

thử pgrepthay vì pidof
Lennoard Silva

4

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:

  • hiển thị các mục nhật ký cho các quy trình từ một gói ứng dụng cụ thể
  • logcat màu

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.

Một đầu ra trông giống như nhập mô tả hình ảnh ở đây


2

Tôi không chắc có cách nào để chỉ xem các thông báo hệ thống liên quan đến ứng dụng của bạn, nhưng bạn có thể lọc dựa trên chuỗi. Nếu bạn đang thực hiện một bản ghi trong chương trình, bạn chỉ có thể bao gồm một từ khóa duy nhất và bộ lọc dựa trên từ đó.


2

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.


2

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.


2

Đặt tên cho nhật ký của bạn. Tôi gọi tôi là "wawa".

nhập mô tả hình ảnh ở đây

Trong Android Studio, đi tới Android-> Chỉnh sửa cấu hình bộ lọc

nhập mô tả hình ảnh ở đây

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:

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây


2

Đâ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`"

2

Trên Windows 10, sử dụng Ionic, điều tuyệt vời với tôi là kết hợp 'findstr' với "INFO: ConsolE" được tạo bởi tất cả các thông báo Ứng dụng. Vì vậy, lệnh của tôi trong dòng lệnh là:

adb logcat | findstr INFO:CONSOLE

1

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"

1

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ẻ.

Nguồn


1
Đừng cho rằng bạn đang viết mã. Bạn có thể quan tâm đến tin nhắn từ thư viện và bạn không thể thay đổi chuỗi nhật ký.
James Moore

1

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%

1

Đâ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 *:Dcuố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 .


0

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


0

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


0

Một biến thể khác của Gavriel applog.shvớ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>]


-1

Trong linux, điều này làm việc cho tôi:

adb logcat | grep `adb shell ps | grep your.package | awk '{print $2}'`
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.