Android için ADT ile Eclipse ile Logcat kullandığımda, diğer birçok uygulamadan da mesaj aldığımı gözlemledim. Bunu filtrelemenin ve yalnızca kendi uygulamamdaki iletileri göstermenin bir yolu var mı?
Android için ADT ile Eclipse ile Logcat kullandığımda, diğer birçok uygulamadan da mesaj aldığımı gözlemledim. Bunu filtrelemenin ve yalnızca kendi uygulamamdaki iletileri göstermenin bir yolu var mı?
Yanıtlar:
Paket adları böylece benzersiz olmasını garanti altına alınmıştır kullanmak Log
için paket adı ve paket adına göre o zaman filtre olarak etiketiyle fonksiyonu :
NOT: Oluşturma Araçları 21.0.3'ten itibaren TAGS 23 veya daha az karakterle sınırlı olduğundan artık çalışmaz.
Log.<log level>("<your package name>", "message");
adb -d logcat <your package name>:<log level> *:S
-d
gerçek bir cihazı ve -e
bir emülatörü ifade eder. Çalışan birden fazla emülatör varsa kullanabilirsiniz -s emulator-<emulator number>
(örn. -s emulator-5558
)
Misal: adb -d logcat com.example.example:I *:S
Veya System.out.print
günlüğe ileti göndermek için kullanıyorsanız , adb -d logcat System.out:I *:S
yalnızca System.out'a yapılan çağrıları göstermek için kullanabilirsiniz.
Tüm günlük düzeylerini ve daha fazla bilgiyi burada bulabilirsiniz: https://developer.android.com/studio/command-line/logcat.html
http://developer.android.com/reference/android/util/Log.html
EDIT: Görünüşe göre silahı biraz atladım ve Eclipse'deki logcat'i sorduğunu fark ettim. Yukarıda gönderdiğim şey komut satırından adb üzerinden logcat kullanmak içindir. Aynı filtrelerin Eclipse'e aktarılıp aktarılmadığından emin değilim.
logcat <your package name>:<log level>
Cevabı kullanarak paket adının geçerli filtre olarak kullanılabileceğini önermektedir. Bu yüzden ben sadece böyle bir şeye ilk satırını değiştirmek tavsiye, aslında ne dediğini anlamak için iki kez cevap okumak için gerekli " logcat <tag>:<log level>
nereye <tag>
sen etiket olarak da kullanılabilir eğer paket adı olabilir android.util.Log
"
PID'yi almak için ps / grep / cut kullanın, ardından bu PID ile logcat girişleri için grep kullanın. İşte kullandığım komut:
adb logcat | grep -F "`adb shell ps | grep com.asanayoga.asanarebel | tr -s [:space:] ' ' | cut -d' ' -f2`"
(Aynı sayıyı içeren ilişkisiz günlük satırlarının teorik probleminden kaçınmak için normal ifadeyi daha da geliştirebilirsiniz, ancak bu benim için hiçbir zaman sorun olmadı)
Bu, birden çok işlem eşleştirilirken de çalışır.
Windows'ta şunları yapabilirsiniz:
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`
Android 7.0'dan beri, logcat --pid filtre seçeneğine sahiptir ve pidof komutu kullanılabilir, com.example.app yerine paket adınızı yazın.
(Ubuntu terminali / Android 7.0'dan beri)
adb logcat --pid=`adb shell pidof -s com.example.app`
veya
adb logcat --pid=$(adb shell pidof -s com.example.app)
Pidof komutu hakkında daha fazla bilgi için:
https://stackoverflow.com/a/15622698/7651532
grep
ve findstr
seçenekleri denedim , ancak günlükleri yalnızca çok fazla ileti hariç bazı değerlerle filtreliyorlar. Cevabınız gerçek, başka bir kütüphaneden günlük mesajı hariç tutmadan uygulama hakkındaki tüm günlüğü göster. Android Studio'nun şu anki 'Yalnızca seçili olanları göster' filtresi gibi. Teşekkürler!
Filtre ekle
İsimleri belirtin
Filtrenizi seçin.
Benim için bu mac çalışıyor Bu Terminal
, adb
daha sonra terminalde aşağıdaki komutu yazdığınız klasöre var
./adb logcat MyTAG:V AndroidRuntime:E *:S
Burada tüm günlükleri filtreleyecek MyTAG
veAndroidRuntime
Log.d("MyTAG", "i am hero"); Log.d("AndroidRunTime", "i am zero");
2) DEBUG giriş Android $ adb -s RKSCWSOV5SAIEUSC shell;
3) $ logcat MyTAG:V AndroidRuntime:E *:S
4) şimdi MyTAG ve AndroidRuntime hatalarını gösterecektir
Birkaç yıl oldu ve bir şey değişti. Ve Eclipse artık resmi olarak desteklenmiyor. İşte size daha güncel iki yaklaşım:
Android monitor
Araç kutusunda logcat başına filtre
uygulayabilirsiniz debuggable process
. Normalde, bir uygulama geliştirdiğinizde bu hata ayıklanabilir bir işlemdir. Arada sırada bununla ilgili sorunlar yaşıyorum ve aşağıdakileri yapın:
Tools
-> Android
-> Enable ADB Integration
.
Zaten etkinleştirilmişse, kapatın ve tekrar açın
Mobil cihazınızı çıkarın ve yeniden takın.
Normal ifade ve hata ayıklama düzeyi ile filtreleme seçenekleri de vardır
Bu, adb logcat
terminal tabanlı bir çözüm kullanmak istiyorsanız üstte güzel bir python sarıcıdır . Bununla ilgili iyi olan şey, birden fazla yapılandırmayı kaydedip bunları yeniden kullanabilmenizdir. Filtreleme işlemi tags
oldukça güvenilirdir. Ayrıca package
yalnızca bir veya daha fazla uygulamanın günlüklerini görmek için filtreleme yapabilirsiniz , ancak uygulamanızı başlatmadan logcat-color
hemen önce başlayabilirsiniz .
Önceki cevaplara yorum yapamayacağım gibi görünüyor, bu yüzden yeni bir cevap göndereceğim. Bu, Tom Mulcahy'nin cevabına yapılan bir yorum olup , adb shell ps
PID sütunu değişken olduğu için komutun çoğu cihazda çalışacak şekilde nasıl değişmesi gerektiğini gösterir .
NOT: Aşağıdaki komut, birçok cihazı bağladığınız durumlarda çalışır. Bu yüzden device id
gereklidir. Aksi takdirde, '[', ']' köşeli parantezlerini atlayabilirsiniz.
1. pid sütununu bulmak için şunu yazın:
adb [-s DEVICE_ID] shell ps | head -n 1
Şimdi PID için sütun numarasını ezberleyin. Numaralandırma başlar 1
.
2. Ardından aşağıdakileri yazın:
adb [-s DEVICE_ID] logcat | grep $(adb [-s DEVICE_ID] shell ps \
| grep "com.example" | awk -F" " ' {print $PUT_COLUMN_HERE}')
Ezberlediğiniz sütunu PUT_COLUMN_HERE
, ör.$5
Uygulamanızı her yeniden çalıştırdığınızda, uygulama işletim sisteminden yeni bir PID aldığı için 2. komutu yeniden çalıştırmanız gerekir.
bunu applog.sh dosyasına koy
#!/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}:"
sonra:
applog.sh com.example.my.package
log.d("TAG", "multine\nlog")
örneğin, yaptıysanız ): adb -d logcat -v long | sed -Ene '/^\[.*'" (${APPID}):"'.*\]/ { N; s/\n/ /; p; :a;' -e 'n; p; s/^.+$/foo/; t a;' -e ' }' | grep -v '^$'
- tr
Windows sistemlerinde gerekli olduğunu varsayıyorum ve APPID
çoklu pids (ayrı olarak |
) izin vermek için parantez içine sarılmış .
Bu benim için USB hata ayıklama ile çalışır:
Cihazı bağlayın ve kullanın:
adb shell
Bağlandığında logcat'i kullanın:
logcat | grep com.yourapp.packagename
Android Studio kullanıyorsanız , logcats almak istediğiniz işlemi seçebilirsiniz. İşte ekran görüntüsü.
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
Logcat'i paket adına göre filtrelemek için bir kabuk betiği yazdım, bence kullanmaktan daha güvenilir
ps | grep com.example.package | cut -c10-15
Gerçek pid'i bulmak için / proc / $ pid / cmdline kullanır, sonra logcat'te bir grep yapar
Ubuntu: adb logcat -b all -v color --pid = `adb shell pidof -s com.packagename` Renk ve sürekli uygulama günlüğü ile
adb shell pidof ...
Biraz bu yüzden benim için iş vermedi adb shell
cihazın içine ed ve koştu top
komut içinde yerini daha sonra orada uygulamam için PID kopyalanıp
pgrep
pidof yerine deneyin
Eclipse için ADT v15 bir uygulama adı belirtmenize izin verir (aslında androidmanifest.xml dosyasındaki paket değeridir).
Uygulamaya göre filtrelemeyi seviyorum, ancak yeni logcat otomatik kaydırma ile ilgili bir hata var. Önceki günlüklere bakmak için biraz yukarı kaydırdığınızda, birkaç saniye içinde otomatik olarak aşağıya doğru kayar. Günlüğün 1/2 yukarı kaydırılması, alttan geri atlamayı engelliyor gibi görünüyor, ancak bu genellikle işe yaramaz.
EDIT: Komut satırından bir uygulama filtresi belirlemeye çalıştım - ama şans yok. Birisi bunu VEYA otomatik kaydırmayı nasıl durduracağını anlarsa, lütfen bana bildirin.
Windows komut istemini kullanma: adb logcat -d | findstr <package>
.
* Bu ilk olarak jj_ tarafından belirtildi , ancak yorumlarda bulmam çok zaman aldı ...
Varyant olarak , Jake Wharton'ın üçüncü parti komut dosyası PID Cat'i kullanabilirsiniz. Bu komut dosyasının iki önemli avantajı vardır:
Belgelerden:
Uygulama geliştirme sırasında genellikle yalnızca uygulamanızdan gelen günlük mesajlarını görüntülemek istersiniz. Ne yazık ki, telefona her konuşlandırışınızda işlem kimliği değiştiği için doğru şey için grep yapmak zorlaşıyor.
Bu komut dosyası, uygulama paketine göre filtreleyerek bu sorunu çözer.
Deneyin: Pencere -> Tercihler -> Android -> LogCat. "VERBOSE" değerini "Şayet logcat görünümünü göster ..." olarak değiştirin. Bana yardımcı oldu.
Eğer kullanıyorsanız Eclipse , basın yeşil + işaretini de LogCat altındaki pencerede ve içinde paket adını (com.example.yourappname) koymak Uygulama Adı tarafından kutuda. Ayrıca, Filtre Adı kutusunda size uygun olan herhangi bir adı seçin ve Tamam'ı tıklayın. LogCat'in sol bölmesinden yeni eklediğiniz filtre seçildiğinde yalnızca uygulamanızla ilgili iletileri görürsünüz.
Günlüğünüze bir ad verin. Benimkine "wawa" dedim.
Android Studio'da Android-> Filtre Yapılandırmalarını Düzenle'ye gidin
Sonra günlükleri verdiğiniz adı yazın. Benim durumumda buna "wawa" deniyor. Aşağıda, yapabileceğiniz filtre türlerine bazı örnekler verilmiştir. System.out, System.err, Günlükler veya paket adlarına göre filtreleyebilirsiniz:
Bu muhtemelen en basit çözümdür.
Tom Mulcahy'nin bir çözümünün üstünde, aşağıdaki gibi daha da basitleştirebilirsiniz:
alias logcat="adb logcat | grep `adb shell ps | egrep '\bcom.your.package.name\b' | cut -c10-15`"
Kullanımı normal takma ad olarak kolaydır. Kabuğuna komutu yazmanız yeterlidir:
logcat
Takma ad kurulumu bunu kolaylaştırır. Normal ifade, çok işlemli uygulamalar için sağlam olmasını sağlayarak yalnızca ana işlemi önemsediğinizi varsayar.
Coz arasında istediğiniz gibi her işlem için daha fazla takma ad ayarlayabilirsiniz. Veya hegazy çözümünü kullanın. :)
Ayrıca, günlük kaydı düzeylerini ayarlamak istiyorsanız,
alias logcat-w="adb logcat *:W | grep `adb shell ps | egrep '\bcom.your.package.name\b' | cut -c10-15`"
Tom Mulcahy'nin cevabını kullanmaya çalıştım ama maalesef çoklu süreçlere sahip uygulamalar için çalışmadı, bu yüzden ihtiyaçlarıma göre düzenledim.
#!/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"
Kullanın -s
!
Kendi etiketinizi kullanmalısınız, şuraya bakın: http://developer.android.com/reference/android/util/Log.html
Sevmek.
Log.d("AlexeysActivity","what you want to log");
Ve sonra günlüğü okumak istediğinizde kullanın>
adb logcat -s AlexeysActivity
Bu, aynı etiketi kullanmayan her şeyi filtreler.
Tom Mulcahy'nin cevabına ek olarak , Windows konsolundaki PID'ye göre filtrelemek istiyorsanız, bunun gibi küçük bir toplu iş dosyası oluşturabilirsiniz:
@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%
Bu tabii ki gelen LogCat kullanımı amaçlayan bir sorudur dışarıdan size Logcat çıkışını görüntülemek istediğiniz Ancak eğer, geliştirici cihazı üzerinde cihazı (programlı), sadece bu gerekir:
Runtime.getRuntime().exec("logcat " + android.os.Process.myPid() + " *:D");
*:D
Sonunda ayıklama günlüğü seviyesinin altında her mesaj filtreleyen ama o out bırakabilir.
Çıkışı, örneğin bir TextView'e yönlendirmek için, örneğin buraya bakın .
Artık kaydedilen filtreler çubuğuna yeni filtreler eklemeden tag: nameofthetag veya app: nameoftheapp yazmak mümkündür
İntelliJ'de (ve muhtemelen tutulmada da) logcat çıktısını metin web görünümü ile filtreleyebilirsiniz , böylece temel olarak telefon aralığının ürettiği her şeyi yazdırır
Gavriel'in başka bir varyantı, applog.sh
birden fazla işlem ve çeşitli cihazların desteklenmesi:
#!/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}"
Kullanımı: applog.sh com.example.my.package [-s <specific device>]
Linux'ta bu benim için çalıştı:
adb logcat | grep `adb shell ps | grep your.package | awk '{print $2}'`