Filter LogCat untuk hanya mendapatkan pesan dari Aplikasi Saya di Android?

341

Saya mengamati bahwa ketika saya menggunakan Logcat dengan Eclipse dengan ADT untuk Android, saya mendapatkan pesan dari banyak aplikasi lain juga. Apakah ada cara untuk memfilter ini dan hanya menampilkan pesan dari aplikasi saya saja.

Vinod
sumber
1
Semua jawaban menyarankan pemfilteran untuk pesan dari aplikasi sedang di-debug. Bahkan dengan filter ini aktif, Logcat spam dari aplikasi lain segera mengisi buffer log tidak peduli seberapa besar itu. Apakah ada cara untuk memberitahu Eclipse untuk tidak mengumpulkan pesan-pesan ini sama sekali atau tetap menghapusnya secara berkala?
Harga

Jawaban:

268

Nama paket dijamin unik sehingga Anda dapat menggunakan Logfungsi dengan tag sebagai nama paket Anda dan kemudian memfilter menurut nama paket :

CATATAN: Pada Build Tools 21.0.3 ini tidak akan berfungsi lagi karena TAGS dibatasi hingga 23 karakter atau kurang.

Log.<log level>("<your package name>", "message");

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

-dmenunjukkan perangkat yang sebenarnya dan -emenunjukkan sebuah emulator. Jika ada lebih dari 1 emulator yang berjalan, Anda dapat menggunakan -s emulator-<emulator number>(mis., -s emulator-5558)

Contoh: adb -d logcat com.example.example:I *:S

Atau jika Anda menggunakan System.out.printuntuk mengirim pesan ke log Anda dapat menggunakan adb -d logcat System.out:I *:Suntuk hanya menampilkan panggilan ke System.out.

Anda dapat menemukan semua level log dan info lebih lanjut di sini: https://developer.android.com/studio/command-line/logcat.html

http://developer.android.com/reference/android/util/Log.html

EDIT: Sepertinya saya sedikit melompati pistol dan baru menyadari bahwa Anda bertanya tentang logcat di Eclipse. Apa yang saya posting di atas adalah untuk menggunakan logcat melalui adb dari baris perintah. Saya tidak yakin apakah filter yang sama mentransfer ke Eclipse.

shanet
sumber
10
Saya tahu pertanyaannya adalah tentang gerhana, tapi saya jatuh cinta dengan baris perintah dan selalu menggunakannya untuk logcat juga. Juga gunakan beberapa alat untuk mewarnai keluaran seperti jsharkey.org/blog/2009/04/22/… membuatnya bahkan berguna
Francisco Jordano
1
Pengujian pada emulator: macet untuk saya ketika saya menjalankan adb -e logcat com.example.example: I *: S, adb -d logcat System.out: I *: S berfungsi.
CoDe
1
@ Syub Apa maksudmu itu macet? Saya memposting ini hampir setahun yang lalu jadi sesuatu di Logcat mungkin telah berubah sejak saat itu.
shanet
59
Metode ini memfilter menurut tag, bukan oleh aplikasi. Metode filter Tom oleh aplikasi
Jonas Alves
17
Dengan menggunakan logcat <your package name>:<log level>jawaban, disarankan untuk menggunakan nama paket sebagai filter yang valid. Saya perlu membaca jawaban dua kali untuk memahami apa yang sebenarnya dikatakannya, oleh karena itu saya sarankan untuk hanya mengubah baris pertama menjadi sesuatu seperti "di logcat <tag>:<log level>mana <tag>bisa menjadi nama paket Anda jika Anda juga menggunakan tag android.util.Log"
Flow
368

Linux dan OS X

Gunakan ps / grep / cut untuk mengambil PID, lalu grep untuk entri logcat dengan PID itu. Inilah perintah yang saya gunakan:

adb logcat | grep -F "`adb shell ps | grep com.asanayoga.asanarebel  | tr -s [:space:] ' ' | cut -d' ' -f2`"

(Anda dapat meningkatkan regex lebih lanjut untuk menghindari masalah teoretis dari baris log yang tidak terkait yang berisi nomor yang sama, tetapi itu tidak pernah menjadi masalah bagi saya)

Ini juga berfungsi saat mencocokkan beberapa proses.

Windows

Pada Windows Anda dapat melakukan:

adb logcat | findstr com.example.package
Tom Mulcahy
sumber
2
@ BTRNaidu: Anda dapat menginstal Cygwin atau menggunakan git-bash (bash for windows)
Phillip
1
pid=$(adb shell ps | grep "package-name" | cut -c10-15) && adb logcat | grep $pid
VishalKale
1
kadang-kadang gc mencetak nomor yang sama dengan nomor pid dari suatu proses ketika membebaskan memori. di sini adalah versi lainadb logcat | grep `adb shell ps | grep org.videolan.vlc | awk '{print $2")"}'`
alijandro
14
Pada Windows Anda dapat melakukan:adb logcat | findstr com.example.package
jj_
8
Hanya sedikit perubahan pada jawaban Anda. Saya akan menyarankan:adb logcat | grep `adb shell ps | grep com.example.package | tr -s [:space:] ' ' | cut -d' ' -f2`
hiepnd
59

Sejak Android 7.0, logcat memiliki opsi filter --pid, dan perintah pidof tersedia, ganti com.example.app dengan nama paket Anda.
(terminal ubuntu / Sejak Android 7.0)

adb logcat --pid=`adb shell pidof -s com.example.app`

atau

adb logcat --pid=$(adb shell pidof -s com.example.app)

Untuk info lebih lanjut tentang perintah pidof:
https://stackoverflow.com/a/15622698/7651532

Kamu Kim
sumber
2
Saya mencoba semua opsi grepdan findstr, tetapi mereka hanya menyaring log dengan beberapa nilai tidak termasuk banyak pesan. Jawaban Anda adalah yang asli, tampilkan semua log tentang aplikasi tanpa mengecualikan pesan log dari perpustakaan lain. Ini seperti filter 'Tampilkan hanya yang dipilih' Android Studio saat ini. Terima kasih!
equiman
2 perintah ini berfungsi selama proses "com.example.app" berjalan. Namun, pesan kesalahan akan muncul jika proses tidak berjalan. Hanya catatan untuk menghindari kejutan.
jonathanzh
53

Tambahkan filter

Tambahkan filter

Tentukan nama

masukkan deskripsi gambar di sini

Pilih filter Anda.

masukkan deskripsi gambar di sini

berilium
sumber
3
Sangat penting untuk menjadi tepat ketika Anda merancang alat pengembangan, karena diharapkan pengguna menjadi tepat. Itu nama paket, bukan nama aplikasi. > :(
Henrik Erlandsson
19

Bagi saya ini bekerja di mac Terminal
Sampai di folder di mana Anda adbkemudian ketik perintah di bawah ini di terminal

./adb logcat MyTAG:V AndroidRuntime:E *:S

Di sini ia akan memfilter semua log dari MyTAGdanAndroidRuntime

Inder Kumar Rathore
sumber
2
1) kode Java: Log.d("MyTAG", "i am hero"); Log.d("AndroidRunTime", "i am zero");2) ke DEBUG login ke Android $ adb -s RKSCWSOV5SAIEUSC shell;3) $ logcat MyTAG:V AndroidRuntime:E *:S 4) sekarang akan menunjukkan verbose MyTAG dan kesalahan AndroidRuntime
1
Ini adalah satu-satunya jawaban yang berfungsi untuk saya di MacOS. Kerja bagus.
om-ha
1
@ om-ha terima kasih, saya menggunakan Studio sejak dulu dan tidak tahu bahwa ia masih memiliki masalah
Inder Kumar Rathore
1
Sebenarnya saya tidak menggunakan Android Studio. Saya menggunakan Flutter, Android SDK, dan Gradle. Sebagai seorang editor, VS Code. Jadi ini adalah cara terbaik untuk mengetahui apa yang terjadi di ponsel android saya
om-ha
13

Perbarui 17 Mei

Sudah beberapa tahun, dan banyak hal telah berubah. Dan Eclipse tidak lagi didukung secara resmi. Jadi, inilah dua pendekatan terbaru:

1. Android Studio

masukkan deskripsi gambar di sini Di Android monitorkotak alat, Anda bisa memfilter logcat per debuggable process. Biasanya, ketika Anda mengembangkan aplikasi itu adalah proses debuggable. Sesekali saya mengalami masalah dengan ini, dan lakukan yang berikut:

  1. Tools-> Android-> Enable ADB Integration.
    Jika sudah diaktifkan, matikan, lalu hidupkan kembali

  2. Cabut dan pasang kembali perangkat seluler Anda.

Ada juga opsi untuk memfilter melalui regex dan level debug

2. warna logcat

Ini adalah pembungkus python yang bagus di atas adb logcatjika Anda ingin menggunakan solusi berbasis terminal. Hal baiknya adalah Anda dapat menyimpan banyak konfigurasi dan menggunakannya kembali. Penyaringan berdasarkan tagscukup dapat diandalkan. Anda juga dapat memfilter berdasarkan packageuntuk melihat log satu atau beberapa aplikasi saja, tetapi Anda mulai logcat-colortepat sebelum meluncurkan aplikasi Anda.

Jawaban lama:

Tampaknya saya tidak dapat mengomentari jawaban sebelumnya, jadi saya akan memposting yang baru. Ini adalah komentar untuk jawaban Tom Mulcahy , yang menunjukkan bagaimana perintah harus berubah sehingga berfungsi pada sebagian besar perangkat, karena adb shell pskolom PID adalah variabel.

CATATAN: Perintah di bawah ini berfungsi untuk kasus di mana Anda telah menghubungkan banyak perangkat. Sangat device iddibutuhkan. Kalau tidak, Anda bisa menghilangkan tanda kurung '[', ']'

1. Untuk mengetahui kolom pid, ketik:

adb [-s DEVICE_ID] shell ps | head -n 1

Sekarang hafal nomor kolom untuk PID. Penomoran dimulai dari 1.

2. Kemudian ketikkan yang berikut ini:

adb [-s DEVICE_ID] logcat | grep $(adb [-s DEVICE_ID] shell ps \
| grep "com.example" | awk -F" " ' {print $PUT_COLUMN_HERE}')

Cukup letakkan kolom yang Anda hafal PUT_COLUMN_HERE, misalnya$5

Peringatan

Setiap kali Anda menjalankan kembali aplikasi Anda, Anda harus menjalankan kembali perintah ke-2, karena aplikasi tersebut mendapatkan PID baru dari OS.

Paschalis
sumber
Lihatlah semua hal yang harus Anda lakukan hanya untuk mendapatkan log untuk aplikasi Anda, bukan aplikasi lain. Plus, saya benar-benar merasa konyol bahwa orang lain dapat melihat log orang lain. Apakah Anda memberi tahu saya bahwa tidak ada yang dapat dilakukan Google tentang hal itu? Pastikan log saya tidak terlihat oleh orang lain, dan jaga kebersihan logcat saya?
TatiOverflow
10

Ini telah bekerja untuk saya di git bash:

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

letakkan ini di 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}:"

kemudian: applog.sh com.example.my.package

Gavriel
sumber
Berikut variasi filter untuk mengambil log multiline (jika Anda telah melakukan log.d("TAG", "multine\nlog")contohnya): adb -d logcat -v long | sed -Ene '/^\[.*'" (${APPID}):"'.*\]/ { N; s/\n/ /; p; :a;' -e 'n; p; s/^.+$/foo/; t a;' -e ' }' | grep -v '^$'- Saya mengabaikannya tr, saya berasumsi itu diperlukan pada sistem Windows, dan saya membungkus APPIDtanda kurung untuk memungkinkan petak mulitple (dipisahkan oleh |) .
Logan Pickup
9

Ini berfungsi untuk saya dengan USB debugging:

  1. Hubungkan perangkat dan gunakan:

    adb shell

  2. Gunakan logcat saat terhubung:

    logcat | grep com.yourapp.packagename

Lennoard Silva
sumber
7

Jika Anda menggunakan Android Studio, Anda dapat memilih proses dari mana Anda ingin menerima logcats. Ini screenshotnya.

masukkan deskripsi gambar di sini

dmSherazi
sumber
1
mulai dari android studio ver 0.4.5 Anda akan mendapatkan pesan dari aplikasi yang hanya berjalan. 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

Saya menulis skrip shell untuk menyaring logcat berdasarkan nama paket, yang menurut saya lebih dapat diandalkan daripada menggunakan

ps | grep com.example.package | cut -c10-15

Ia menggunakan / proc / $ pid / cmdline untuk mencari tahu pid yang sebenarnya, kemudian melakukan grep pada logcat

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

kevin
sumber
7

Ubuntu: adb logcat -b all -v color --pid = `adb shell pidof -s com.packagename` Dengan warna dan log aplikasi yang berkelanjutan

Sandeep PC
sumber
The adb shell pidof ...bit tidak bekerja untuk saya jadi saya adb shelled ke dalam perangkat dan berlari topmenyalin PID untuk aplikasi saya di sana dan kemudian menggantinya di perintah Anda
edzillion
coba pgrepalih-alih pidof
Lennoard Silva
Ini berfungsi untuk saya di OSX, poin ekstra untuk -v warna
Mars
6

ADT v15 untuk Eclipse memungkinkan Anda menentukan nama aplikasi (yang sebenarnya merupakan nilai paket di androidmanifest.xml Anda).

Saya suka bisa memfilter berdasarkan aplikasi, tetapi logcat baru memiliki bug dengan autoscroll. Ketika Anda sedikit gulir ke atas untuk melihat log sebelumnya, secara otomatis gulir kembali ke bawah dalam beberapa detik. Tampaknya menggulung 1/2 jalan ke atas log tidak membuatnya melompat kembali ke bawah, tapi itu sering tidak berguna.

EDIT: Saya mencoba menentukan filter aplikasi dari baris perintah - tetapi tidak berhasil. Jika seseorang mengetahui hal ini ATAU cara menghentikan autoscroll, harap beri tahu saya.

Aaron T Harris
sumber
6

Menggunakan Windows command prompt: adb logcat -d | findstr <package>.

* Ini pertama kali disebutkan oleh jj_ , tapi butuh waktu lama untuk menemukannya di komentar ...

rareclass
sumber
4

Sebagai varian, Anda dapat menggunakan skrip PID Cat pihak ketiga oleh Jake Wharton. Script ini memiliki dua keunggulan utama:

  • memperlihatkan entri log untuk proses dari paket aplikasi tertentu
  • logcat warna

Dari dokumentasi:

Selama pengembangan aplikasi Anda sering ingin hanya menampilkan pesan log yang berasal dari aplikasi Anda. Sayangnya, karena ID proses berubah setiap kali Anda menggunakan ponsel, itu menjadi tantangan untuk menerima hal yang benar.

Script ini memecahkan masalah itu dengan memfilter berdasarkan paket aplikasi.

Outputnya seperti masukkan deskripsi gambar di sini

yoAlex5
sumber
2

Saya tidak yakin ada cara untuk hanya melihat pesan sistem mengenai aplikasi Anda, tetapi Anda dapat memfilter berdasarkan string. Jika Anda membuat log di dalam program, Anda bisa memasukkan kata kunci unik tertentu, dan memfilter berdasarkan kata itu.

bjpcomet
sumber
2

Coba: Jendela -> Preferensi -> Android -> LogCat. Ganti bidang "Tampilkan tampilan logcat jika ..." nilai "VERBOSE". Itu membantu saya.

Siruk Viktor
sumber
2

Jika Anda menggunakan Eclipse , tekan tanda + hijau di jendela logCat di bawah ini dan masukkan nama paket Anda (com.example.yourappname) di kotak by Application Name . Juga, pilih nama yang nyaman bagi Anda di kotak Nama Filter dan klik ok. Anda hanya akan melihat pesan yang terkait dengan aplikasi Anda ketika filter yang baru Anda tambahkan dipilih dari panel kiri di logCat.

Khaled Alanezi
sumber
2

Beri nama log Anda. Saya menyebut milik saya "wawa".

masukkan deskripsi gambar di sini

Di Android Studio, buka Android-> Edit Konfigurasi Filter

masukkan deskripsi gambar di sini

Kemudian ketikkan nama yang Anda berikan log. Dalam kasus saya, ini disebut "wawa". Berikut ini beberapa contoh jenis filter yang dapat Anda lakukan. Anda bisa memfilter menurut System.out, System.err, Log, atau nama paket:

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Gene
sumber
2

Ini mungkin solusi paling sederhana.

Di atas solusi dari Tom Mulcahy, Anda dapat lebih menyederhanakannya seperti di bawah ini:

alias logcat="adb logcat | grep `adb shell ps | egrep '\bcom.your.package.name\b' | cut -c10-15`"

Penggunaannya semudah alias biasa. Cukup ketik perintah di shell Anda:

logcat

Pengaturan alias membuatnya mudah. Dan regex membuatnya kuat untuk aplikasi multi-proses, dengan asumsi Anda hanya peduli pada proses utama.

Tentu saja Anda dapat mengatur lebih banyak alias untuk setiap proses sesuka Anda. Atau gunakan solusi hegazy. :)

Selain itu, jika Anda ingin mengatur level logging, itu

alias logcat-w="adb logcat *:W | grep `adb shell ps | egrep '\bcom.your.package.name\b' | cut -c10-15`"
Frank Du
sumber
2

Di Windows 10, menggunakan Ionic, yang paling berhasil bagi saya adalah menggabungkan 'findstr' dengan "INFO: CONSOLE" yang dihasilkan oleh semua pesan App. Jadi, perintah saya di baris perintah adalah:

adb logcat | findstr INFO:CONSOLE
Lud Akell
sumber
1

Saya mencoba menggunakan jawaban Tom Mulcahy tetapi sayangnya itu tidak berfungsi untuk aplikasi dengan banyak proses jadi saya mengeditnya agar sesuai dengan kebutuhan saya.

#!/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"
Ahmed Hegazy
sumber
1

Gunakan -s!

Anda harus menggunakan tag Anda sendiri, lihat: http://developer.android.com/reference/android/util/Log.html

Suka.

Log.d("AlexeysActivity","what you want to log");

Dan kemudian ketika Anda ingin membaca log gunakan>

adb logcat -s AlexeysActivity

Itu menyaring semua yang tidak menggunakan tag yang sama.

Sumber

KrisWebDev
sumber
1
Jangan menganggap Anda sedang menulis kode. Anda mungkin peduli tentang pesan dari perpustakaan, dan Anda tidak dapat mengubah string log.
James Moore
1

Selain jawaban Tom Mulcahy , jika Anda ingin memfilter dengan PID di konsol Windows, Anda dapat membuat file batch kecil seperti itu:

@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%
Lawyno
sumber
1

Ini jelas pertanyaan yang ditujukan untuk penggunaan Logcat dari luar perangkat pengembang, namun jika Anda ingin menampilkan output Logcat pada perangkat (secara terprogram), Anda hanya memerlukan ini:

Runtime.getRuntime().exec("logcat " + android.os.Process.myPid() + " *:D");

The *:Dpada akhirnya menyaring setiap pesan di bawah level log Debug tetapi Anda dapat mengabaikannya.

Untuk mengarahkan output ke, katakanlah, TextView, lihat misalnya di sini .

Tom Ladek
sumber
0

Sekarang dimungkinkan untuk mengetik tag: nameofthetag atau aplikasi: nameoftheapp untuk memfilter tanpa menambahkan filter baru ke bilah filter yang tersimpan

Fernando Gallego
sumber
0

Di intelliJ (dan mungkin juga di gerhana), Anda dapat memfilter keluaran logcat dengan tampilan teks web , sehingga pada dasarnya mencetak semua yang dihasilkan phonegap

Marcin Mikołajczyk
sumber
0

Varian lain dari Gavriel applog.shdengan dukungan beberapa perangkat dan aplikasi dengan berbagai proses:

#!/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}"

Pemakaian: applog.sh com.example.my.package [-s <specific device>]

L.illarionov
sumber
-1

Di linux, ini bekerja untuk saya:

adb logcat | grep `adb shell ps | grep your.package | awk '{print $2}'`
spectralsun
sumber