Я заметил, что когда я использую Logcat с Eclipse с ADT для Android, я получаю сообщения и от многих других приложений. Есть ли способ отфильтровать это и показать только сообщения из моего собственного приложения только.
Я заметил, что когда я использую Logcat с Eclipse с ADT для Android, я получаю сообщения и от многих других приложений. Есть ли способ отфильтровать это и показать только сообщения из моего собственного приложения только.
Ответы:
Имена пакетов гарантированно будут уникальными, поэтому вы можете использовать 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.
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 есть опция --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
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
.
Если он уже был включен, выключите его, а затем снова включите
Отключите и снова подключите мобильное устройство.
Есть также варианты фильтрации через регулярные выражения и уровень отладки.
Это хорошая оболочка 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 из ОС.
поместите это в 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, вы можете выбрать процесс, из которого вы хотите получать logcats. Вот скриншот.
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, а затем выполнить grep для logcat.
Ubuntu: adb logcat -b all -v color --pid = `adb shell pidof -s com.packagename` С цветом и непрерывным журналом приложения
adb shell pidof ...
бит у меня не сработал, поэтому я adb shell
подключился к устройству и запустил там top
скопированный PID для моего приложения, а затем заменил его в своей команде
pgrep
вместо пидоф
ADT v15 для Eclipse позволяет вам указать имя приложения (которое фактически является значением пакета в вашем androidmanifest.xml).
Мне нравится возможность фильтровать по приложениям, но в новом logcat есть ошибка с автопрокруткой. Когда вы прокручиваете немного вверх, чтобы просмотреть предыдущие журналы, он автоматически прокручивается назад к основанию через пару секунд. Кажется, что прокрутка на полпути вверх по бревну не дает ему спрыгнуть назад, но это часто бесполезно.
РЕДАКТИРОВАТЬ: я пытался указать фильтр приложения из командной строки - но не повезло. Если кто-то выяснит, ИЛИ как остановить автопрокрутку, пожалуйста, дайте мне знать.
В качестве варианта можно использовать сторонний скрипт PID Cat от Jake Wharton. Этот скрипт имеет два основных преимущества:
Из документации:
Во время разработки приложения вы часто хотите отображать только сообщения журнала, поступающие из вашего приложения. К сожалению, из-за того, что идентификатор процесса меняется каждый раз, когда вы развертываете на телефоне, поиск правильной вещи становится проблемой.
Этот скрипт решает эту проблему путем фильтрации по пакетам приложений.
Попробуйте: Окно -> Настройки -> Android -> LogCat. Измените в поле «Показать представление logcat, если ...» значение «VERBOSE». Это помогло мне.
Если вы используете Eclipse , нажмите зеленый знак + в окне logCat ниже и введите имя вашего пакета (com.example.yourappname) в поле By Application Name . Кроме того, выберите любое удобное для вас имя в поле Имя фильтра и нажмите ОК. Вы увидите только сообщения, относящиеся к вашему приложению, когда только что добавленный фильтр выбран на левой панели logCat.
Дайте вашему журналу имя. Я назвал мой "Вава".
В Android Studio перейдите в Android-> Изменить настройки фильтра.
Затем введите имя, которое вы дали журналы. В моем случае это называется "вава". Вот несколько примеров типов фильтров, которые вы можете использовать. Вы можете фильтровать по System.out, System.err, журналам или именам пакетов:
Это, наверное, самое простое решение.
Помимо решения от 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`"
Я попытался использовать ответ Тома Малкахи, но, к сожалению, он не работал для приложений с несколькими процессами, поэтому я редактировал его в соответствии со своими потребностями.
#!/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");
И тогда, когда вы хотите прочитать журнал использования>
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 или app: nameoftheapp для фильтрации без добавления новых фильтров на панель сохраненных фильтров.
В intelliJ (и, возможно, также в eclipse) вы можете фильтровать вывод logcat по текстовому веб-представлению , поэтому он печатает практически все, что производит phonegap
Еще один вариант Гавриэля 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}'`