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


341

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


1
Все ответы предполагают фильтрацию сообщений от отлаживаемого приложения. Даже если эти фильтры включены, спам Logcat из других приложений вскоре заполняет буфер журнала независимо от его размера. Есть ли способ заставить Eclipse вообще не собирать эти сообщения или периодически удалять их?
Цена

Ответы:


268

Имена пакетов гарантированно будут уникальными, поэтому вы можете использовать Logфункцию с тегом в качестве имени вашего пакета, а затем фильтровать по имени пакета :

ПРИМЕЧАНИЕ: Начиная с Build Tools 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

РЕДАКТИРОВАТЬ: Похоже, я немного подскочил пистолет и только что понял, что вы спрашивали о logcat в Eclipse. То, что я написал выше, для использования logcat через adb из командной строки. Я не уверен, что те же фильтры переносятся в Eclipse.


10
Я знаю, что вопрос был о затмении, но я влюблен в командную строку и всегда использую ее также для logcat. Также используйте некоторые инструменты для раскраски вывода, такие как jsharkey.org/blog/2009/04/22/… делает его даже полезным
Francisco Jordano

1
Тестирование на эмуляторе: оно застревало у меня при выполнении adb -e logcat com.example.example: I *: S, adb -d logcat System.out: I *: S работает.
CoDe

1
@ Шубх Что ты имеешь в виду, что он застрял? Я опубликовал это почти год назад, поэтому с тех пор что-то в Logcat могло измениться.
Шанет

59
Этот метод фильтрует по тегу, а не по приложению. Метод Тома фильтрует приложение
Джонас Алвес

17
Использование logcat <your package name>:<log level>ответа предполагает, что можно использовать имя пакета в качестве допустимого фильтра. Мне нужно было прочитать ответ дважды, чтобы понять, что он на самом деле говорит, поэтому я рекомендую просто изменить первую строку на что-то вроде « logcat <tag>:<log level>где <tag>может быть имя вашего пакета, если вы также использовали его в качестве тега в android.util.Log»
Flow

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)
Филипп

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")"}'`
алихандро

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 есть опция --pid filter и доступна команда 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
@ Оу-ха, спасибо, я давно пользовался 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-цвет

Это хорошая оболочка Python, 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

Предостережение

Каждый раз, когда вы перезапускаете свое приложение, вы должны перезапускать 2-ю команду, потому что приложение получает новый PID из ОС.


Посмотрите на все эти вещи, которые вы должны сделать, чтобы получить журналы для вашего приложения, а не других приложений. Кроме того, я действительно считаю смешным, что другие люди могут видеть журналы других людей. Вы говорите мне, что Google ничего не может с этим поделать? Просто убедитесь, что мои журналы не видны другим людям, и сохраните мой logcat в чистоте?
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, вы можете выбрать процесс, из которого вы хотите получать logcats. Вот скриншот.

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


1
начиная с версии Android Studio 0.4.5 вы будете получать сообщения только из приложения, которое работает. 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, а затем выполнить grep для 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вместо пидоф
ленноард сильва

Это работает для меня на OSX, дополнительные очки за -v цвет
Марс

6

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

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

РЕДАКТИРОВАТЬ: я пытался указать фильтр приложения из командной строки - но не повезло. Если кто-то выяснит, ИЛИ как остановить автопрокрутку, пожалуйста, дайте мне знать.


6

Использование командной строки Windows: adb logcat -d | findstr <package> .

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


4

В качестве варианта можно использовать сторонний скрипт PID Cat от Jake Wharton. Этот скрипт имеет два основных преимущества:

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

Из документации:

Во время разработки приложения вы часто хотите отображать только сообщения журнала, поступающие из вашего приложения. К сожалению, из-за того, что идентификатор процесса меняется каждый раз, когда вы развертываете на телефоне, поиск правильной вещи становится проблемой.

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

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


2

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


2

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


2

Если вы используете Eclipse , нажмите зеленый знак + в окне logCat ниже и введите имя вашего пакета (com.example.yourappname) в поле By Application Name . Кроме того, выберите любое удобное для вас имя в поле Имя фильтра и нажмите ОК. Вы увидите только сообщения, относящиеся к вашему приложению, когда только что добавленный фильтр выбран на левой панели logCat.


2

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

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

В Android Studio перейдите в Android-> Изменить настройки фильтра.

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

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

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


2

Это, наверное, самое простое решение.

Помимо решения от Tom Mulcahy, вы можете еще больше упростить его, как показано ниже:

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

Использование легко, как обычный псевдоним. Просто введите команду в вашей оболочке:

logcat

Настройка псевдонима делает его удобным. И регулярное выражение делает его надежным для многопроцессорных приложений, если вы заботитесь только о главном процессе.

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

Кроме того, если вы хотите установить уровни ведения журнала, это

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

И тогда, когда вы хотите прочитать журнал использования>

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 или app: nameoftheapp для фильтрации без добавления новых фильтров на панель сохраненных фильтров.


0

В intelliJ (и, возможно, также в eclipse) вы можете фильтровать вывод logcat по текстовому веб-представлению , поэтому он печатает практически все, что производит phonegap


0

Еще один вариант Гавриэля 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>]


-1

В Linux это работало для меня:

adb logcat | grep `adb shell ps | grep your.package | awk '{print $2}'`
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.