Фильтр LogCat, чтобы получить только сообщения из моего приложения в Android?


Я заметил, что когда я использую Logcat с Eclipse с ADT для Android, я получаю сообщения от многих других приложений, а также. Есть ли способ фильтровать это и показывать только сообщения из моего собственного приложения.

29 252

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

Добавить фильтр

Add filter

указать имена

enter image description here

выбрать свой фильтр.

enter image description here

для меня это работает в Mac Terminal
Добрался до папки, где у вас есть adb затем введите следующую команду в терминале

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

здесь он будет фильтровать все журналы MyTAG и AndroidRuntime

Обновление 17 Мая

прошло несколько лет, и все меняется. И "затмение" больше не поддерживается официально. Итак, вот еще два современных подхода:

1. Android Studio

enter image description here В Android monitor toolbox, вы можете фильтровать logcat за debuggable process. Обычно при разработке приложения это отлаживаемый процесс. Время от времени у меня возникают проблемы с этим, и я делаю следующее:

  1. Tools ->Android ->Enable ADB Integration.
    Если он уже был включен, то отключите его, а затем снова включите

  2. отключите и снова подключите мобильное устройство.

есть также опции для фильтрации через регулярное выражение и уровень отладки

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

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

ADT v15 для Eclipse позволяет указать имя приложения (которое на самом деле является значением пакета в вашем androidmanifest.XML.)

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

редактировать: я пробовал выбрав приложение, фильтр из командной строки, но не повезло. Если кто-то выяснит или как остановить автопрокрутку, пожалуйста, дайте мне знать.

Если вы используете Android Studio вы можете выбрать процесс, из которого вы хотите получить logcats. Вот скриншот.

enter image description here

С помощью командной строки Windows:adb logcat -d | findstr <package>.

*Это было впервые упомянуто jj_, но мне потребовались годы, чтобы найти его в комментариях...

Я не уверен, что есть способ видеть только системные сообщения о вашем приложении, но вы можете фильтровать на основе строки. Если вы делаете журнал в программе, вы можете просто включить определенное уникальное ключевое слово и фильтровать на основе этого слова.

просто используйте фильтры внутри logcat. Там есть кнопка, которая позволяет добавлять фильтры. Просто укажите идентификатор приложения, убедитесь, что он выбран после этого, и все готово, легко!

Попробуйте: Окно - > Настройки - > Android - > LogCat. Изменить поле " показать представление logcat, если ..."значение " многословный". Это помогло мне.

Если вы используете затмение, нажмите зеленый знак"+" на logCat окно ниже и поместите имя пакета (com.образец.yourappname) в по имени приложения

дайте вашему журналу имя. Я назвал свой "Вава".

enter image description here

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

enter image description here

введите имя, которое вы дали журналы. В моем случае это называется "wawa". Вот несколько примеров типов фильтров, которые вы можете сделать. Вы можете фильтровать по системе.вон, система.err, журналы или имена пакетов:

enter image description hereenter image description hereenter image description here

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

#!/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 отладки:

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

    adb shell

  2. простое использование 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 за правильную вещь.

этот скрипт решает эту проблему путем фильтрации по пакету приложений.

вывод выглядит так enter image description here

теперь можно ввести тег: 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, см. например здесь.

в linux это сработало для меня:

adb logcat | grep `adb shell ps | grep your.package | awk '{print }'`