Я помітив, що коли я використовую Logcat з Eclipse з ADT для Android, я отримую повідомлення також від багатьох інших програм. Чи є спосіб фільтрувати це та показувати лише повідомлення з моєї власної програми.
Я помітив, що коли я використовую Logcat з Eclipse з ADT для Android, я отримую повідомлення також від багатьох інших програм. Чи є спосіб фільтрувати це та показувати лише повідомлення з моєї власної програми.
Відповіді:
Імена пакунків гарантовано унікальні, тому ви можете використовувати 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.
logcat <your package name>:<log level>
відповіді говорить про те, що можна використовувати ім'я пакета як дійсний фільтр. Мені потрібно було прочитати відповідь двічі, щоб зрозуміти, що вона насправді говорить, тому я рекомендую просто змінити перший рядок на щось на кшталт " logcat <tag>:<log level>
де <tag>
може бути назва вашого пакета, якщо ви також використовували як тег android.util.Log
"
Використовуйте 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 ви можете:
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, у 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
grep
і findstr
параметри, але вони фільтрують лише журнали з деяким значенням, виключаючи безліч повідомлень. Ваша відповідь справжня, показуйте весь журнал про програму, не виключаючи повідомлення журналу з інших бібліотек. Це як у Android Studio поточний фільтр "Показати лише вибране". Дякую!
Додати фільтр
Вкажіть імена
Виберіть свій фільтр.
Для мене це працює в mac Terminal
Перехід до папки, в яку ви adb
потім введіть команду нижче в терміналі
./adb logcat MyTAG:V AndroidRuntime:E *:S
Тут він буде фільтрувати всі журнали MyTAG
таAndroidRuntime
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
Минуло кілька років, і все змінилося. І Eclipse вже не підтримується офіційно. Ось ось два новітні підходи:
У Android monitor
панелі інструментів ви можете відфільтрувати logcat per debuggable process
. Зазвичай, коли ви розробляєте додаток, це процес налагодження. Раз у раз у мене виникають проблеми з цим, і я роблю наступне:
Tools
-> Android
-> Enable ADB Integration
.
Якщо це вже було включено, вимкніть його та знову ввімкніть
Відключіть і підключіть мобільний пристрій.
Існують також варіанти фільтрації через регулярний вираз та рівень налагодження
Це хороша обгортка пітона, 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
Кожен раз, коли ви повторно запускаєте свою програму, вам доведеться повторно запускати другу команду, оскільки програма отримує новий PID від ОС.
помістіть це в 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
в круглі дужки, щоб дозволити багатовідповідні підджі (розділені на |
) .
Це для мене працює при налагодженні USB:
Підключіть пристрій і використовуйте:
adb shell
Використовуйте logcat при підключенні:
logcat | grep com.yourapp.packagename
Якщо ви використовуєте Android Studio, ви можете вибрати процес, з якого ви бажаєте отримувати логіни. Ось скріншот.
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 за назвою пакета, який, на мою думку, є більш надійним, ніж використання
ps | grep com.example.package | cut -c10-15
Він використовує / proc / $ pid / cmdline, щоб дізнатися фактичний pid, а потім зробіть греп на logcat
Ubuntu: adb logcat -b all -v color --pid = `adb shell pidof -s com.packagename` З кольором та безперервним журналом програми
adb shell pidof ...
Трохи не працювали для мене , тому я adb shell
ед в пристрій і бігав top
скопіював PID для мого програми там , а потім замінити його в команді
pgrep
замість pidof
ADT v15 для Eclipse дозволяє вказати назву програми (яка фактично є пакетом у вашому androidmanifest.xml).
Мені подобається, що я можу фільтрувати за додатком, але новий logcat має помилку з автоматичним прокручуванням. Коли ви трохи прокрутите вгору, щоб переглянути попередні журнали, вони автоматично прокручуються назад до низу через пару секунд. Здається, прокручування на 1/2 шляху колоди не дає стрибнути назад на дно, але це часто марно.
EDIT: Я намагався вказати фільтр додатків із командного рядка - але не пощастило. Якщо хтось зрозумів це АБО як зупинити автоскрол, будь ласка, дайте мені знати.
Використання командного рядка для Windows: adb logcat -d | findstr <package>
.
* Про це вперше згадував jj_ , але мені знадобилося віки, щоб знайти його у коментарях ...
Як варіант, ви можете використовувати сторонній сценарій PID Cat Джейка Уортона. Цей сценарій має дві основні переваги:
З документації:
Під час розробки додатків ви часто бажаєте відображати лише повідомлення журналу, що надходять із вашої програми. На жаль, оскільки ідентифікатор процесу змінюється щоразу, коли ви розгортаєтесь на телефон, це стає проблемою, щоб потягнути за потрібне.
Цей скрипт вирішує цю проблему, фільтруючи пакет програм.
Спробуйте: Вікно -> Налаштування -> Android -> LogCat. Змінити поле "Показати перегляд logcat, якщо ..." значення "VERBOSE". Це мені допомогло.
Якщо ви використовуєте Eclipse , натисніть зелений знак + у вікні logCat нижче та введіть назву пакета (com.example.yourappname) у поле Ім'я програми . Крім того, виберіть будь-яке зручне для вас ім'я у полі Ім'я фільтра та натисніть кнопку ОК. Ви побачите лише повідомлення, пов’язані з вашою програмою, коли фільтр, який ви тільки що додали, обраний із лівої панелі в logCat.
Укажіть ім’я свого журналу. Я назвав свою "wawa".
У Android Studio перейдіть до Android-> Редагувати конфігурації фільтрів
Потім введіть ім’я, яке ви дали журналам. У моєму випадку це називається "wawa". Ось кілька прикладів типів фільтрів, які ви можете зробити. Ви можете фільтрувати за System.out, System.err, Журналами чи іменами пакунків:
Це, мабуть, найпростіше рішення.
На додаток до рішення від Тома Малкахі, ви можете додатково спростити його, як нижче:
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`"
Я спробував використати відповідь Тома Малкахі, але, на жаль, він не працює для додатків з декількома процесами, тому я відредагував його відповідно до моїх потреб.
#!/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"
Використовуйте -s
!
Вам слід скористатися власним тегом, подивіться: http://developer.android.com/reference/android/util/Log.html
Подібно до.
Log.d("AlexeysActivity","what you want to log");
І тоді, коли ви хочете прочитати журнал use>
adb logcat -s AlexeysActivity
Це фільтрує все, що не використовує один і той же тег.
На додаток до відповіді Тома Малкахі , якщо ви хочете відфільтрувати 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%
Це, очевидно, питання, спрямоване на використання Logcat за межами пристрою розробника, однак якщо ви хочете відобразити висновок Logcat на пристрої (програмно), вам просто потрібно це:
Runtime.getRuntime().exec("logcat " + android.os.Process.myPid() + " *:D");
В *:D
кінці фільтрується кожне повідомлення нижче рівня журналу налагодження, але ви можете залишити це.
Щоб направити вихід на, скажімо, TextView, дивіться, наприклад, тут .
Тепер можна ввести тег: nameofthetag або додаток: nameoftheapp для фільтрування без додавання нових фільтрів до збереженої панелі фільтрів
У IntelliJ (і, можливо, також у затемненні) ви можете відфільтрувати вихід logcat за допомогою текстового веб-перегляду , тому він друкує в основному все, що виробляє фонегап.
Ще один варіант 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>]
У Linux це працювало для мене:
adb logcat | grep `adb shell ps | grep your.package | awk '{print $2}'`