Фильтр LogCat, чтобы получить только сообщения из моего приложения в Android?
Я заметил, что когда я использую Logcat с Eclipse с ADT для Android, я получаю сообщения от многих других приложений, а также. Есть ли способ фильтровать это и показывать только сообщения из моего собственного приложения.
29 ответов:
имена пакетов гарантированно будут уникальными, так что вы можете использовать
Log
функция с тегом в качестве имени пакета, а затем фильтр по имени пакета:Примечание: начиная с Build Tools 21.0.3 это больше не будет работать, поскольку теги ограничены 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
показывать только вызовы в систему.из.вы можете найти все уровни журнала и более подробную информацию здесь:https://developer.android.com/studio/command-line/logcat.html
http://developer.android.com/reference/android/util/Log.html
редактировать: похоже, Я немного подскочил и просто понял, что вы спрашивали о logcat в Eclipse. То, что я опубликовал выше, предназначено для использования logcat через adb из командной строки. Я не уверен, что одни и те же фильтры передаются в Eclipse.
Linux и OS X
используйте ps/grep / cut, чтобы захватить PID, а затем grep для записей logcat с этим PID. Вот команда, которую я использую:
adb logcat | grep -F "`adb shell ps | grep com.example.package | cut -c10-15`"
(вы можете улучшить регулярное выражение дальше, чтобы избежать теоретической проблемы несвязанных строк журнала, содержащих одно и то же число, но это никогда не было проблемой для меня)
Это также работает при сопоставлении нескольких процессов.
Windows
на Windows вы можете сделать:
adb logcat | findstr com.example.package
для меня это работает в Mac
Terminal
Добрался до папки, где у вас естьadb
затем введите следующую команду в терминале./adb logcat MyTAG:V AndroidRuntime:E *:S
здесь он будет фильтровать все журналы
MyTAG
иAndroidRuntime
Обновление 17 Мая
прошло несколько лет, и все меняется. И "затмение" больше не поддерживается официально. Итак, вот еще два современных подхода:
1. Android Studio
В
Android monitor
toolbox, вы можете фильтровать logcat заdebuggable process
. Обычно при разработке приложения это отлаживаемый процесс. Время от времени у меня возникают проблемы с этим, и я делаю следующее:
Tools
->Android
->Enable ADB Integration
.
Если он уже был включен, то отключите его, а затем снова включитеотключите и снова подключите мобильное устройство.
есть также опции для фильтрации через регулярное выражение и уровень отладки
2. logcat-color
это хорошая обертка python поверх
adb logcat
если вы хотите использовать Терминальные решения. Хорошая вещь об этом является то, что вы можете сохранить несколько конфигураций и просто использовать их. Фильтрация поtags
вполне надежна. Вы также можете фильтровать поpackage
чтобы увидеть журналы только одного или нескольких приложений, но вы начинаетеlogcat-color
право перед запуском вашего приложения.Ответ:
кажется, что я не могу комментировать предыдущие ответы, поэтому я опубликую новый. Это комментарий к Том Малкахиответ, который показывает, как команда должна измениться, чтобы работать на большинстве устройств, так как
adb shell ps
столбец PID является переменным.Примечание: команда ниже работает для случаев, когда вы подключили много устройств. Так что это. В противном случае, вы можете просто опустить скобки' [',']'
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
, например,будьте осторожны
каждый раз, когда вы повторно запускаете приложение, вы должны повторно запустить 2-ю команду, потому что приложение получает новый PID из ОС.
положите это на applog.sh
#!/bin/sh PACKAGE= 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
начиная с Android 7.0, logcat имеет -- PID filter option, и команда pidof доступна, замените com.образец.приложение к имени вашего пакета.
(ubuntu terminal / начиная с 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
это работает для меня в git bash:
$ pid=$(adb shell ps | grep <package name> | cut -c11-15) ; adb logcat | grep $pid
Я написал сценарий оболочки для фильтрации logcat по имени пакета, который я считаю более надежным, чем использование
ps | grep com.example.package | cut -c10-15
он использует /proc/$pid / cmdline, чтобы узнать фактический pid, а затем сделать grep на logcat
ADT v15 для Eclipse позволяет указать имя приложения (которое на самом деле является значением пакета в вашем androidmanifest.XML.)
Я люблю быть в состоянии фильтровать по приложению, но новый logcat имеет ошибку с автопрокруткой. Когда вы прокручиваете немного вверх, чтобы посмотреть на предыдущие журналы, он автоматически прокручивается вниз через пару секунд. Кажется, прокрутка 1/2 пути вверх по журналу не позволяет ему прыгать обратно на дно, но это часто бесполезно.
редактировать: я пробовал выбрав приложение, фильтр из командной строки, но не повезло. Если кто-то выяснит или как остановить автопрокрутку, пожалуйста, дайте мне знать.
Если вы используете Android Studio вы можете выбрать процесс, из которого вы хотите получить logcats. Вот скриншот.
С помощью командной строки Windows:
adb logcat -d | findstr <package>
.*Это было впервые упомянуто jj_, но мне потребовались годы, чтобы найти его в комментариях...
Я не уверен, что есть способ видеть только системные сообщения о вашем приложении, но вы можете фильтровать на основе строки. Если вы делаете журнал в программе, вы можете просто включить определенное уникальное ключевое слово и фильтровать на основе этого слова.
просто используйте фильтры внутри logcat. Там есть кнопка, которая позволяет добавлять фильтры. Просто укажите идентификатор приложения, убедитесь, что он выбран после этого, и все готово, легко!
Попробуйте: Окно - > Настройки - > Android - > LogCat. Изменить поле " показать представление logcat, если ..."значение " многословный". Это помогло мне.
Если вы используете затмение, нажмите зеленый знак"+" на logCat окно ниже и поместите имя пакета (com.образец.yourappname) в по имени приложения
дайте вашему журналу имя. Я назвал свой "Вава".
в Android Studio перейдите в Android - > редактировать конфигурации фильтров
введите имя, которое вы дали журналы. В моем случае это называется "wawa". Вот несколько примеров типов фильтров, которые вы можете сделать. Вы можете фильтровать по системе.вон, система.err, журналы или имена пакетов:
Я попытался использовать ответ Тома Малкахи, но, к сожалению, он не работал для приложений с несколькими процессами, поэтому я редактирую его в соответствии с моими потребностями.
#!/bin/bash if [ "$#" -ne 1 ]; then echo "Illegal number of parameters"; exit 1; fi echo "Lof for package name: " PROCESSES=`adb shell ps | grep "" | 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"
Это, вероятно, самое простое решение.
поверх решения от Tom Mulcahy, вы можете еще больше упростить его, как показано ниже:
alias logcat="adb logcat | grep `adb shell ps | egrep '\bcom.your.package.name\b' | cut -c10-15`"
использование легко, как обычный псевдоним. Просто введите команду в командной строке:
logcat
настройка псевдонима делает его удобным. И регулярное выражение делает его надежным для приложений с несколькими процессами, предполагая, что вы заботитесь только о главном процессе.
из coz вы можете установить больше псевдонимов для каждого процесса, как вам угодно. Или использовать решение Хегази. :)
кроме того, если вы хотите установить уровень ведения журнала, это
alias logcat-w="adb logcat *:W | grep `adb shell ps | egrep '\bcom.your.package.name\b' | cut -c10-15`"
использовать
-s
!вы должны использовать свой собственный тег, посмотри: http://developer.android.com/reference/android/util/Log.html
нравится.
Log.d("AlexeysActivity","what you want to log");
и затем, когда вы хотите прочитать журнал>
adb logcat -s AlexeysActivity
это отфильтровывает все, что не использует тот же тег.
это работает для меня с USB отладки:
подключите устройство и использовать:
adb shell
простое использование logcat:
logcat | grep com.youapp.packagename
кроме Том Малкахи's ответ, если вы хотите фильтровать по 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%
в Windows 10, используя Ionic, то, что отлично работало для меня, было объединено "findstr" с "INFO:CONSOLE", генерируемым всеми сообщениями приложения. Итак, моя команда в командной строке:
adb logcat | findstr INFO:CONSOLE
в качестве варианта вы можете использовать сторонний скрипт PID Cat Джейк Уортон. Этот скрипт имеет два основных преимущества:
- показывает записи журнала для процессов из конкретного пакета приложения
- color logcat
из документации:
во время разработки приложений вы часто хотите отображать только сообщения журнала, поступающие из вашего приложения. К сожалению, поскольку идентификатор процесса изменяется каждый раз при развертывании телефон становится проблемой для grep за правильную вещь.
этот скрипт решает эту проблему путем фильтрации по пакету приложений.
теперь можно ввести тег: nameofthetag или приложение: nameoftheapp для фильтрации без добавления новых фильтров в сохраненную панель фильтров
в intelliJ (и, вероятно, в eclipse также) вы можете фильтровать вывод logcat по тексту webview, поэтому он печатает в основном все, что производит phonegap
еще один вариант Гавриила
applog.sh
С поддержкой нескольких устройств и приложений с несколькими процессами:#!/bin/sh PKG= 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(,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>]
это, очевидно, вопрос, направленный на использование Logcat от за пределами устройства разработчика, однако, если вы хотите отобразить выход Logcat on устройства (программно), вам просто нужно это:
Runtime.getRuntime().exec("logcat " + android.os.Process.myPid() + " *:D");
The
*:D
в конце отфильтровывает каждое сообщение ниже уровня журнала отладки, но вы можете оставить это.чтобы направить вывод, скажем, в TextView, см. например здесь.