Фільтр LogCat, щоб отримувати лише повідомлення з програми "Моя програма" в Android?


341

Я помітив, що коли я використовую Logcat з Eclipse з ADT для Android, я отримую повідомлення також від багатьох інших програм. Чи є спосіб фільтрувати це та показувати лише повідомлення з моєї власної програми.


1
Усі відповіді пропонують відфільтрувати повідомлення з програми з налагодження. Навіть при включенні цих фільтрів спам Logcat від інших додатків незабаром заповнює буфер журналу незалежно від того, наскільки він великий. Чи є спосіб сказати Eclipse взагалі не збирати ці повідомлення або продовжувати їх періодично видаляти?
Ціна

Відповіді:


267

Імена пакунків гарантовано унікальні, тому ви можете використовувати Logфункцію з тегом як назву пакета, а потім фільтрувати за назвою пакета :

ПРИМІТКА: З Інструментів збирання 21.0.3 це більше не працюватиме, оскільки TAGS обмежений до 23 символів або менше.

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

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

-dпозначає фактичний пристрій і -eпозначає емулятор. Якщо працює більше ніж 1 емулятор, ви можете використовувати -s emulator-<emulator number>(наприклад, -s emulator-5558)

Приклад: adb -d logcat com.example.example:I *:S

Або якщо ви використовуєте System.out.printдля надсилання повідомлень у журнал, ви можете використовувати adb -d logcat System.out:I *:Sлише дзвінки до System.out.

Ви можете знайти всі рівні журналу та додаткову інформацію тут: https://developer.android.com/studio/command-line/logcat.html

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

EDIT: Схоже, я трохи стрибнув пістолет і щойно зрозумів, що ви питаєте про logcat у Eclipse. Що я розмістив вище, це використання logcat через adb з командного рядка. Я не впевнений, чи переходять ті самі фільтри в Eclipse.


10
Я знаю, що питання стосувалося затемнення, але я закоханий у командний рядок і завжди використовую його для logcat. Також використовуйте деякі інструменти для фарбування результатів, наприклад jsharkey.org/blog/2009/04/22/…, це навіть корисно
Франциско Йордано

1
Тестування на емуляторі: він застряг для мене, коли я виконую adb -e logcat com.example.example: I *: S, adb -d logcat System.out: I *: S працює.
CoDe

1
@Shubh Що ти означає, що він застряг? Я опублікував це майже рік тому, щоб з того часу щось змінилося в Logcat.
Шенет

58
Цей метод фільтрує за тегами, а не за додатком. Метод Тома фільтрує за програмою
Jonas Alves

17
Використання logcat <your package name>:<log level>відповіді говорить про те, що можна використовувати ім'я пакета як дійсний фільтр. Мені потрібно було прочитати відповідь двічі, щоб зрозуміти, що вона насправді говорить, тому я рекомендую просто змінити перший рядок на щось на кшталт " logcat <tag>:<log level>де <tag>може бути назва вашого пакета, якщо ви також використовували як тег android.util.Log"
Потік

368

Linux та OS X

Використовуйте ps / grep / cut, щоб захопити PID, а потім grep для записів logcat із цим PID. Ось команда, яку я використовую:

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

(Ви можете вдосконалити регулярний вираз, щоб уникнути теоретичної проблеми пов'язаних між собою рядків журналу, що містять однакове число, але це ніколи не було проблемою для мене)

Це також працює при узгодженні декількох процесів.

Windows

У Windows ви можете:

adb logcat | findstr com.example.package

2
@BTRNaidu: Ви можете встановити Cygwin або використовувати git-bash (bash для windows)
Phillip

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

1
колись gc друкує те саме число з pid номером процесу, коли вільна пам'ять. ось ще одна версіяadb logcat | grep `adb shell ps | grep org.videolan.vlc | awk '{print $2")"}'`
alijandro

14
У Windows ви можете зробити:adb logcat | findstr com.example.package
jj_

8
Просто незначна зміна вашої відповіді. Я б запропонував:adb logcat | grep `adb shell ps | grep com.example.package | tr -s [:space:] ' ' | cut -d' ' -f2`
hiepnd

59

Оскільки Android 7.0, у logcat є - опція фільтру швидкого доступу, і команда pidof доступна, замініть com.example.app на назву пакета.
(термінал ubuntu / з Android 7.0)

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

або

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

Для отримання додаткової інформації про команду pidof:
https://stackoverflow.com/a/15622698/7651532


2
Я спробував усі grepі findstrпараметри, але вони фільтрують лише журнали з деяким значенням, виключаючи безліч повідомлень. Ваша відповідь справжня, показуйте весь журнал про програму, не виключаючи повідомлення журналу з інших бібліотек. Це як у Android Studio поточний фільтр "Показати лише вибране". Дякую!
еквіман

Ці 2 команди працюють доти, доки запущений процес "com.example.app". Однак повідомлення про помилки з’являться, якщо процес не працює. Просто бічна нота, щоб уникнути сюрпризів.
Джонатанж

53

Додати фільтр

Додати фільтр

Вкажіть імена

введіть тут опис зображення

Виберіть свій фільтр.

введіть тут опис зображення


3
Це дуже важливо бути точним, коли ви розробляєте інструменти розробки, оскільки очікується, що користувач буде точним. Це назва пакета, а не назва програми. > :(
Генрік Ерландссон

19

Для мене це працює в mac Terminal
Перехід до папки, в яку ви adbпотім введіть команду нижче в терміналі

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

Тут він буде фільтрувати всі журнали MyTAGтаAndroidRuntime


2
1) Код Java: Log.d("MyTAG", "i am hero"); Log.d("AndroidRunTime", "i am zero");2) для DEBUG увійдіть в Android $ adb -s RKSCWSOV5SAIEUSC shell;3) $ logcat MyTAG:V AndroidRuntime:E *:S 4) тепер він покаже багатослівний MyTAG та помилки AndroidRuntime

1
Це єдина відповідь, яка працювала для мене на MacOS. Чудова робота.
ом-ха

1
@ om-ha дякую, я довго використовував Studio і не знав, що у нього все ще є проблема
Inder Kumar Rathore

1
Насправді я не використовую Android Studio. Я використовую Flutter, Android SDK та Gradle. Як редактор, VS Code. Тож це чудовий спосіб дізнатися, що відбувається в моєму телефоні Android
ом-ха

13

Оновлення 17 травня

Минуло кілька років, і все змінилося. І Eclipse вже не підтримується офіційно. Ось ось два новітні підходи:

1. Android Studio

введіть тут опис зображення У Android monitorпанелі інструментів ви можете відфільтрувати logcat per debuggable process. Зазвичай, коли ви розробляєте додаток, це процес налагодження. Раз у раз у мене виникають проблеми з цим, і я роблю наступне:

  1. Tools-> Android-> Enable ADB Integration.
    Якщо це вже було включено, вимкніть його та знову ввімкніть

  2. Відключіть і підключіть мобільний пристрій.

Існують також варіанти фільтрації через регулярний вираз та рівень налагодження

2. logcat-колір

Це хороша обгортка пітона, adb logcatякщо ви хочете використовувати рішення на базі терміналу. Хороша річ у тому, що ви можете зберегти декілька конфігурацій і просто повторно їх використовувати. Фільтрування за допомогою tagsдосить надійне. Ви також можете відфільтрувати, packageщоб побачити журнали лише однієї чи кількох програм, але ви почнете logcat-colorбезпосередньо перед запуском програми.

Стара відповідь:

Здається, я не можу коментувати попередні відповіді, тому я опублікую нову. Це коментар до відповіді Тома Малкахі , який показує, як команда повинна змінюватися так, щоб працювати на більшості пристроїв, оскільки adb shell psстовпець PID є змінним.

ПРИМІТКА . Команда нижче працює для випадків, коли ви підключили багато пристроїв. Так device idпотрібно. В іншому випадку ви можете просто опустити дужки '[', ']'

1. Щоб дізнатися стовпець pid, введіть:

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

Тепер запам'ятайте номер стовпця для PID. Нумерація починається з 1.

2. Потім введіть наступне:

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

Просто поставте стовпець, який ви запам'ятали PUT_COLUMN_HERE, наприклад$5

Caveat

Кожен раз, коли ви повторно запускаєте свою програму, вам доведеться повторно запускати другу команду, оскільки програма отримує новий PID від ОС.


Подивіться на всі ці речі, які вам потрібно зробити лише для отримання журналів для вашої програми, а не для інших програм. Плюс, мені справді смішно, що інші люди можуть бачити чужі журнали. Ти мені кажеш, що Google нічого з цим не може зробити? Просто переконайтесь, що мої журнали не бачать інші люди, і підтримуйте чистість моїх журналів?
TatiOverflow

10

Це працює для мене в git bash:

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

9

помістіть це в 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}:"

тоді: applog.sh com.example.my.package


Ось варіант фільтра для захоплення багаторядкових журналів (якщо ви це зробили, log.d("TAG", "multine\nlog")наприклад): 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, і я загорнув APPIDв круглі дужки, щоб дозволити багатовідповідні підджі (розділені на |) .
Логан Пікап

9

Це для мене працює при налагодженні USB:

  1. Підключіть пристрій і використовуйте:

    adb shell

  2. Використовуйте logcat при підключенні:

    logcat | grep com.yourapp.packagename


7

Якщо ви використовуєте Android Studio, ви можете вибрати процес, з якого ви бажаєте отримувати логіни. Ось скріншот.

введіть тут опис зображення


1
як з android studio ver 0.4.5 u, ви отримаєте повідомлення від програми, яка працює тільки. 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

Я написав скрипт оболонки для фільтрації logcat за назвою пакета, який, на мою думку, є більш надійним, ніж використання

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

Він використовує / proc / $ pid / cmdline, щоб дізнатися фактичний pid, а потім зробіть греп на logcat

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


7

Ubuntu: adb logcat -b all -v color --pid = `adb shell pidof -s com.packagename` З кольором та безперервним журналом програми


adb shell pidof ...Трохи не працювали для мене , тому я adb shellед в пристрій і бігав topскопіював PID для мого програми там , а потім замінити його в команді
edzillion

спробуйте pgrepзамість pidof
Lennoard Silva

Це працює для мене на OSX, додаткові бали за колір -v
Марс

6

ADT v15 для Eclipse дозволяє вказати назву програми (яка фактично є пакетом у вашому androidmanifest.xml).

Мені подобається, що я можу фільтрувати за додатком, але новий logcat має помилку з автоматичним прокручуванням. Коли ви трохи прокрутите вгору, щоб переглянути попередні журнали, вони автоматично прокручуються назад до низу через пару секунд. Здається, прокручування на 1/2 шляху колоди не дає стрибнути назад на дно, але це часто марно.

EDIT: Я намагався вказати фільтр додатків із командного рядка - але не пощастило. Якщо хтось зрозумів це АБО як зупинити автоскрол, будь ласка, дайте мені знати.


6

Використання командного рядка для Windows: adb logcat -d | findstr <package>.

* Про це вперше згадував jj_ , але мені знадобилося віки, щоб знайти його у коментарях ...


4

Як варіант, ви можете використовувати сторонній сценарій PID Cat Джейка Уортона. Цей сценарій має дві основні переваги:

  • показує записи журналу для процесів із певного пакету додатків
  • кольоровий логкат

З документації:

Під час розробки додатків ви часто бажаєте відображати лише повідомлення журналу, що надходять із вашої програми. На жаль, оскільки ідентифікатор процесу змінюється щоразу, коли ви розгортаєтесь на телефон, це стає проблемою, щоб потягнути за потрібне.

Цей скрипт вирішує цю проблему, фільтруючи пакет програм.

Вихід виглядає так введіть тут опис зображення


2

Я не впевнений, що існує спосіб бачити лише системні повідомлення стосовно вашої програми, але ви можете фільтрувати на основі рядка. Якщо ви робите журнал у програмі, ви можете просто включити певне унікальне ключове слово та фільтрувати на основі цього слова.


2

Спробуйте: Вікно -> Налаштування -> Android -> LogCat. Змінити поле "Показати перегляд logcat, якщо ..." значення "VERBOSE". Це мені допомогло.


2

Якщо ви використовуєте Eclipse , натисніть зелений знак + у вікні logCat нижче та введіть назву пакета (com.example.yourappname) у поле Ім'я програми . Крім того, виберіть будь-яке зручне для вас ім'я у полі Ім'я фільтра та натисніть кнопку ОК. Ви побачите лише повідомлення, пов’язані з вашою програмою, коли фільтр, який ви тільки що додали, обраний із лівої панелі в logCat.


2

Укажіть ім’я свого журналу. Я назвав свою "wawa".

введіть тут опис зображення

У Android Studio перейдіть до Android-> Редагувати конфігурації фільтрів

введіть тут опис зображення

Потім введіть ім’я, яке ви дали журналам. У моєму випадку це називається "wawa". Ось кілька прикладів типів фільтрів, які ви можете зробити. Ви можете фільтрувати за System.out, System.err, Журналами чи іменами пакунків:

введіть тут опис зображення введіть тут опис зображення введіть тут опис зображення


2

Це, мабуть, найпростіше рішення.

На додаток до рішення від Тома Малкахі, ви можете додатково спростити його, як нижче:

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

Використання легко, як звичайний псевдонім. Просто введіть команду в оболонці:

logcat

Налаштування псевдоніму робить його зручним. Регекс робить його надійним для багатопроцесорних додатків, припускаючи, що ви дбаєте лише про основний процес.

З іншого боку, ви можете встановити більше псевдонімів для кожного процесу, як вам заманеться. Або скористайтеся розчином гегази. :)

Крім того, якщо ви хочете встановити рівні реєстрації, це так

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

2

У Windows 10, використовуючи Ionic, мені дуже вдало поєднати "findstr" із "INFO: CONSOLE", створеним усіма повідомленнями додатків. Отже, моя команда в командному рядку:

adb logcat | findstr INFO:CONSOLE

1

Я спробував використати відповідь Тома Малкахі, але, на жаль, він не працює для додатків з декількома процесами, тому я відредагував його відповідно до моїх потреб.

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

Вам слід скористатися власним тегом, подивіться: http://developer.android.com/reference/android/util/Log.html

Подібно до.

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

І тоді, коли ви хочете прочитати журнал use>

adb logcat -s AlexeysActivity

Це фільтрує все, що не використовує один і той же тег.

Джерело


1
Не припускайте, що ви пишете код. Вас можуть хвилювати повідомлення з бібліотек, і ви не можете змінити рядки журналу.
Джеймс Мур

1

На додаток до відповіді Тома Малкахі , якщо ви хочете відфільтрувати PID на консолі Windows, ви можете створити такий невеликий пакетний файл:

@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

Це, очевидно, питання, спрямоване на використання Logcat за межами пристрою розробника, однак якщо ви хочете відобразити висновок Logcat на пристрої (програмно), вам просто потрібно це:

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

В *:Dкінці фільтрується кожне повідомлення нижче рівня журналу налагодження, але ви можете залишити це.

Щоб направити вихід на, скажімо, TextView, дивіться, наприклад, тут .


0

Тепер можна ввести тег: nameofthetag або додаток: nameoftheapp для фільтрування без додавання нових фільтрів до збереженої панелі фільтрів


0

У IntelliJ (і, можливо, також у затемненні) ви можете відфільтрувати вихід logcat за допомогою текстового веб-перегляду , тому він друкує в основному все, що виробляє фонегап.


0

Ще один варіант Gavriel's applog.shз підтримкою декількох пристроїв та додатків з декількома процесами:

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

Використання: applog.sh com.example.my.package [-s <specific device>]


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.