Android'de Uygulamam'dan yalnızca iletileri almak için LogCat'e filtre uygulansın mı?


341

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ı?


1
Tüm yanıtlar, hata ayıklanan uygulamadaki iletilere filtre uygulanmasını önerir. Bu filtreler açık olsa bile, diğer uygulamalardan gelen Logcat spam'ı, ne kadar büyük olursa olsun günlük arabelleğini yakında doldurur. Eclipse'e bu mesajları hiç toplamamasını veya düzenli olarak silmeye devam etmesini söylemenin bir yolu var mı?
Fiyat

Yanıtlar:


268

Paket adları böylece benzersiz olmasını garanti altına alınmıştır kullanmak Logiç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

-dgerçek bir cihazı ve -ebir 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.printgünlüğe ileti göndermek için kullanıyorsanız , adb -d logcat System.out:I *:Syalnı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.


10
Sorunun tutulma ile ilgili olduğunu biliyorum, ama komut satırına aşığım ve her zaman logcat için de kullanıyorum. Çıktıyı renklendirmek için jsharkey.org/blog/2009/04/22/… gibi bazı araçları da daha da kullanışlı hale getirir
Francisco Jordano

1
Emülatörde test etme: adb -e logcat com.example.example.example.example.ex örnek çalıştırdığımda benim için sıkıştı.
CoDe

1
@Shubh Ne sıkışmış demek istiyorsun? Bunu neredeyse bir yıl önce yayınladım, bu yüzden Logcat'teki bir şey o zamandan beri değişmiş olabilir.
shanet

59
Bu yöntem uygulamaya göre değil, etikete göre filtrelenir. Tom'un yöntem filtreleri app
Jonas Alves

17
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"
Akış

368

Linux ve OS X

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.

pencereler

Windows'ta şunları yapabilirsiniz:

adb logcat | findstr com.example.package

2
@BTRNaidu: Cygwin'i yükleyebilir veya git-bash (windows için bash) kullanabilirsiniz
Phillip

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

1
somtimes gc, boş hafızadayken aynı sayıyı bir işlemin pid numarasıyla yazdırır. İşte başka bir versiyonadb logcat | grep `adb shell ps | grep org.videolan.vlc | awk '{print $2")"}'`
alijandro

14
Windows'da şunları yapabilirsiniz:adb logcat | findstr com.example.package
jj_

8
Cevabınızda ufak bir değişiklik. Ben öneririm:adb logcat | grep `adb shell ps | grep com.example.package | tr -s [:space:] ' ' | cut -d' ' -f2`
hiepnd

59

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


2
Tüm grepve findstrseç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!
equiman

Bu 2 komut, "com.example.app" işlemi çalıştığı sürece çalışır. Ancak, işlem çalışmıyorsa hata mesajları görünür. Sürprizleri önlemek için sadece bir yan not.
jonathanzh

53

Filtre ekle

Filtre ekle

İsimleri belirtin

resim açıklamasını buraya girin

Filtrenizi seçin.

resim açıklamasını buraya girin


3
Geliştirme araçları tasarlarken hassas olmak oldukça önemlidir, çünkü kullanıcının hassas olması beklenir. Bu paket adı, uygulama adı değil. > :(
Henrik Erlandsson

19

Benim için bu mac çalışıyor Bu Terminal
, adbdaha 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 MyTAGveAndroidRuntime


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

1
MacOS'ta benim için çalışan tek cevap bu. İyi iş.
om-ha

1
@ om-ha teşekkürler, Studio'yu uzun süre kullandım ve hala sorunu olduğunu bilmiyordum
Inder Kumar Rathore

1
Aslında Android Studio kullanmıyorum. Flutter, Android SDK ve Gradle kullanıyorum. Bir editör olarak VS Kodu. Bu, android telefonumda neler olduğunu bilmek için mükemmel bir yoldur
om-ha

13

Güncelleme 17 Mayıs

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:

1. Android Studio

resim açıklamasını buraya girinAndroid monitorAraç 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:

  1. Tools-> Android-> Enable ADB Integration.
    Zaten etkinleştirilmişse, kapatın ve tekrar açın

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

2. logcat rengi

Bu, adb logcatterminal 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 tagsoldukça güvenilirdir. Ayrıca packageyalnızca bir veya daha fazla uygulamanın günlüklerini görmek için filtreleme yapabilirsiniz , ancak uygulamanızı başlatmadan logcat-colorhemen önce başlayabilirsiniz .

Eski Cevap:

Ö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 psPID 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 idgereklidir. 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

Uyarı

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.


Diğer uygulamalara değil, yalnızca uygulamanızın günlüklerini almak için yapmanız gereken tüm bu şeylere bakın. Ayrıca, diğer insanların diğer insanların günlüklerini görebilmelerini gerçekten saçma buluyorum. Bana Google'ın bu konuda yapabileceği hiçbir şey olmadığını mı söylüyorsunuz? Günlüklerimin başkaları tarafından görülmediğinden emin olun ve logcat'imi temiz tutuyor musunuz?
TatiOverflow

10

Bu git bash benim için çalışıyor:

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

9

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


İşte çok satırlı günlükleri yakalamak için filtrenin bir varyasyonu ( 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 '^$'- trWindows sistemlerinde gerekli olduğunu varsayıyorum ve APPIDçoklu pids (ayrı olarak |) izin vermek için parantez içine sarılmış .
Logan Pickup

9

Bu benim için USB hata ayıklama ile çalışır:

  1. Cihazı bağlayın ve kullanın:

    adb shell

  2. Bağlandığında logcat'i kullanın:

    logcat | grep com.yourapp.packagename


7

Android Studio kullanıyorsanız , logcats almak istediğiniz işlemi seçebilirsiniz. İşte ekran görüntüsü.

resim açıklamasını buraya girin


1
android stüdyo ver 0.4.5 gibi u sadece çalışan app mesajları alacak. 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

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 shellcihazın içine ed ve koştu topkomut içinde yerini daha sonra orada uygulamam için PID kopyalanıp
edzillion

pgreppidof yerine deneyin
Lennoard Silva

Bu benim için OSX üzerinde çalışıyor, -v renk için ekstra puan
Mars

6

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.


6

Windows komut istemini kullanma: adb logcat -d | findstr <package> .

* Bu ilk olarak jj_ tarafından belirtildi , ancak yorumlarda bulmam çok zaman aldı ...


4

Varyant olarak , Jake Wharton'ın üçüncü parti komut dosyası PID Cat'i kullanabilirsiniz. Bu komut dosyasının iki önemli avantajı vardır:

  • belirli bir uygulama paketindeki işlemler için günlük girdilerini gösterir
  • renk logcat

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.

Bir çıktı benziyor resim açıklamasını buraya girin


2

Yalnızca uygulamanızla ilgili sistem mesajlarını görmenin bir yolu olmadığından emin değilim, ancak bir dizeye göre filtre uygulayabilirsiniz. Program içinde bir günlük yapıyorsanız, belirli bir benzersiz anahtar kelime ekleyebilir ve bu kelimeye göre filtreleyebilirsiniz.


2

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.


2

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.


2

Günlüğünüze bir ad verin. Benimkine "wawa" dedim.

resim açıklamasını buraya girin

Android Studio'da Android-> Filtre Yapılandırmalarını Düzenle'ye gidin

resim açıklamasını buraya girin

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:

resim açıklamasını buraya girin resim açıklamasını buraya girin resim açıklamasını buraya girin


2

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

2

Windows 10'da, Ionic kullanarak, benim için çok işe yarayan şey, 'findstr' ile tüm Uygulama mesajlarının oluşturduğu "INFO: CONSOLE" ile birleştirilmesiydi. Yani, komut satırındaki komutum:

adb logcat | findstr INFO:CONSOLE

1

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"

1

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.

Kaynak


1
Kodu yazdığınızı varsaymayın. Kitaplıklardan gelen mesajları önemseyebilirsiniz ve günlük dizelerini değiştiremezsiniz.
James Moore

1

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%

1

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");

*:DSonunda 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 .


0

Artık kaydedilen filtreler çubuğuna yeni filtreler eklemeden tag: nameofthetag veya app: nameoftheapp yazmak mümkündür


0

İ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


0

Gavriel'in başka bir varyantı, applog.shbirden 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>]


-1

Linux'ta bu benim için çalıştı:

adb logcat | grep `adb shell ps | grep your.package | awk '{print $2}'`
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.