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.
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.
Jawaban:
Nama paket dijamin unik sehingga Anda dapat menggunakan Log
fungsi 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
-d
menunjukkan perangkat yang sebenarnya dan -e
menunjukkan 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.print
untuk mengirim pesan ke log Anda dapat menggunakan adb -d logcat System.out:I *:S
untuk 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.
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
"
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.
Pada Windows Anda dapat melakukan:
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`
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
grep
dan 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!
Tambahkan filter
Tentukan nama
Pilih filter Anda.
Bagi saya ini bekerja di mac Terminal
Sampai di folder di mana Anda adb
kemudian ketik perintah di bawah ini di terminal
./adb logcat MyTAG:V AndroidRuntime:E *:S
Di sini ia akan memfilter semua log dari MyTAG
danAndroidRuntime
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
Sudah beberapa tahun, dan banyak hal telah berubah. Dan Eclipse tidak lagi didukung secara resmi. Jadi, inilah dua pendekatan terbaru:
Di Android monitor
kotak 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:
Tools
-> Android
-> Enable ADB Integration
.
Jika sudah diaktifkan, matikan, lalu hidupkan kembali
Cabut dan pasang kembali perangkat seluler Anda.
Ada juga opsi untuk memfilter melalui regex dan level debug
Ini adalah pembungkus python yang bagus di atas adb logcat
jika Anda ingin menggunakan solusi berbasis terminal. Hal baiknya adalah Anda dapat menyimpan banyak konfigurasi dan menggunakannya kembali. Penyaringan berdasarkan tags
cukup dapat diandalkan. Anda juga dapat memfilter berdasarkan package
untuk melihat log satu atau beberapa aplikasi saja, tetapi Anda mulai logcat-color
tepat sebelum meluncurkan aplikasi Anda.
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 ps
kolom PID adalah variabel.
CATATAN: Perintah di bawah ini berfungsi untuk kasus di mana Anda telah menghubungkan banyak perangkat. Sangat device id
dibutuhkan. 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
Setiap kali Anda menjalankan kembali aplikasi Anda, Anda harus menjalankan kembali perintah ke-2, karena aplikasi tersebut mendapatkan PID baru dari OS.
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
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 APPID
tanda kurung untuk memungkinkan petak mulitple (dipisahkan oleh |
) .
Ini berfungsi untuk saya dengan USB debugging:
Hubungkan perangkat dan gunakan:
adb shell
Gunakan logcat saat terhubung:
logcat | grep com.yourapp.packagename
Jika Anda menggunakan Android Studio, Anda dapat memilih proses dari mana Anda ingin menerima logcats. Ini screenshotnya.
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
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
Ubuntu: adb logcat -b all -v color --pid = `adb shell pidof -s com.packagename` Dengan warna dan log aplikasi yang berkelanjutan
adb shell pidof ...
bit tidak bekerja untuk saya jadi saya adb shell
ed ke dalam perangkat dan berlari top
menyalin PID untuk aplikasi saya di sana dan kemudian menggantinya di perintah Anda
pgrep
alih-alih pidof
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.
Sebagai varian, Anda dapat menggunakan skrip PID Cat pihak ketiga oleh Jake Wharton. Script ini memiliki dua keunggulan utama:
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.
Coba: Jendela -> Preferensi -> Android -> LogCat. Ganti bidang "Tampilkan tampilan logcat jika ..." nilai "VERBOSE". Itu membantu saya.
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.
Beri nama log Anda. Saya menyebut milik saya "wawa".
Di Android Studio, buka Android-> Edit Konfigurasi Filter
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:
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`"
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"
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.
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%
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 *:D
pada akhirnya menyaring setiap pesan di bawah level log Debug tetapi Anda dapat mengabaikannya.
Untuk mengarahkan output ke, katakanlah, TextView, lihat misalnya di sini .
Sekarang dimungkinkan untuk mengetik tag: nameofthetag atau aplikasi: nameoftheapp untuk memfilter tanpa menambahkan filter baru ke bilah filter yang tersimpan
Di intelliJ (dan mungkin juga di gerhana), Anda dapat memfilter keluaran logcat dengan tampilan teks web , sehingga pada dasarnya mencetak semua yang dihasilkan phonegap
Varian lain dari Gavriel applog.sh
dengan 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>]
Di linux, ini bekerja untuk saya:
adb logcat | grep `adb shell ps | grep your.package | awk '{print $2}'`