adb shell Logcat 包名
adb shell Logcat with Package Name
是否可以在每一行中也显示日志的包名称?
使用
logcat -v long
将包名称字段(在 PID 之后)留空。
我想用不同的标签过滤来自特定应用程序的日志,只是想知道是否可行。
logcat
记录没有 "package name field"。因此没有 standard/built-in 方法来过滤它。
尽管从 Android 7.0 开始,您可以使用 logcat --pid
选项结合 pidof -s
命令按 binary/package 名称过滤输出:
adb shell "logcat --pid=$(pidof -s <package_name>)"
将 "
替换为 '
以获得 Linux/MacOS
这是我的脚本。有点生锈,但仍在使用。
PID=`adb shell ps | grep -i <your package name> | cut -c10-15`;
adb logcat | grep $PID
实际上我有一个 python 脚本来添加更多颜色,还有一个 while 循环来在进程重新启动时继续监视它,但我想你会明白这一点的。
选项 1
逐行输入:
adb shell
su
bash
PKG_PID_LIST_CACHE=$(eval $(pm list packages | cut -d ':' -f 2 | sed 's/^\(.*\)$/echo \"$\(echo \) $\(pidof \)\";/'))
PROC_PID_LIST_CACHE=$(ps -A -o NAME -o PID)
PID_LIST_CACHE=$(echo "$PKG_PID_LIST_CACHE\n$PROC_PID_LIST_CACHE")
function pid2pkg() { pkgName=$(echo "$PID_LIST_CACHE" | grep -w | cut -d ' ' -f1 | head -1); if [ "$pkgName" != "" ] ; then echo $pkgName; else echo "*NOT RUNNING*"; fi }
eval "$(logcat -d | sed -r -e 's/([^ ]+) +([^ ]+) +([^ ]+) +([^ ]+) +(.*)/ $\(pid2pkg \) /g' | sed -r -e 's/(.+)/echo -e \"\"/g')"
logcat 输出将采用以下格式:
[Time] [Name] [Type] [Message]
示例:
14:34:59.386 wpa_supplicant E wpa_supplicant: nl80211: Failed to set IPv4 unicast in multicast filter
14:35:02.231 com.android.phone D TelephonyProvider: subIdString = 1 subId = 1
14:35:03.469 android.hardware.wifi@1.0-service E WifiHAL : wifi_get_logger_supported_feature_set: Error -3 happened.
14:35:03.518 system_server I WifiService: getWifiApEnabledState uid=10086
14:35:03.519 dev.ukanth.ufirewall D AFWall : isWifiApEnabled is false
14:35:03.520 system_server I GnssLocationProvider: WakeLock released by handleMessage(UPDATE_NETWORK_STATE, 0, 123)
14:35:03.522 dev.ukanth.ufirewall I AFWall : Now assuming wifi connection
一些系统进程没有包。例如 system_server
和 wpa_supplicant
。如果找不到包名称,则会显示进程名称。
注意事项:
如果某个PID背后的进程不再是运行ning,你就无法再获取到package/process名称。
进程自行退出或您的设备重启后,PID 实际上可能分配给完全不同的进程。
所以您可能想检查该过程实际持续了多长时间 运行ning:
ps -e -o pid -o stime -o name
选项 2
如果您希望格式更具可读性,您可以将我的日志记录脚本复制到您的设备并执行它:
better_logging.sh
PKG_PID_LIST_CACHE=$(eval $(pm list packages | cut -d ':' -f 2 | sed 's/^\(.*\)$/echo \"$\(echo \) $\(pidof \)\";/'))
PROC_PID_LIST_CACHE=$(ps -A -o NAME -o PID)
PID_LIST_CACHE=$(echo "$PKG_PID_LIST_CACHE\n$PROC_PID_LIST_CACHE")
MAX_LEN=$(echo "$PID_LIST_CACHE" | cut -d ' ' -f1 | awk '{ if ( length > L ) { L=length} }END{ print L}')
function pid2pkg() {
pkgName=$(echo "$PID_LIST_CACHE" | grep -w | cut -d ' ' -f1 | head -1);
if [ "$pkgName" != "" ] ; then
printf "%-${MAX_LEN}s" "$pkgName";
else
printf "%-${MAX_LEN}s" "<UNKNOWN (NOT RUNNING)>";
fi
}
eval "$(\
logcat -d | \
sed -r -e 's/([^ ]+) +([^ ]+) +([^ ]+) +([^ ]+) +(.*)/\ $\(pid2pkg \) /g' | \
sed -r -e 's/(.+)/echo -e \"\"/g' \
)" | \
awk '
function color(c,s) {
printf("3[%dm%s3[0m\n",90+c,s)
}
/ E / {color(1,[=14=]);next}
/ D / {color(2,[=14=]);next}
/ W / {color(3,[=14=]);next}
/ I / {color(4,[=14=]);next}
{print}
'
要复制并运行它,您可以使用:
adb push better_logging.sh /sdcard/better_logging.sh
adb shell "bash /sdcard/better_logging.sh"
输出将如下所示:
是否可以在每一行中也显示日志的包名称?
使用
logcat -v long
将包名称字段(在 PID 之后)留空。
我想用不同的标签过滤来自特定应用程序的日志,只是想知道是否可行。
logcat
记录没有 "package name field"。因此没有 standard/built-in 方法来过滤它。
尽管从 Android 7.0 开始,您可以使用 logcat --pid
选项结合 pidof -s
命令按 binary/package 名称过滤输出:
adb shell "logcat --pid=$(pidof -s <package_name>)"
将 "
替换为 '
以获得 Linux/MacOS
这是我的脚本。有点生锈,但仍在使用。
PID=`adb shell ps | grep -i <your package name> | cut -c10-15`;
adb logcat | grep $PID
实际上我有一个 python 脚本来添加更多颜色,还有一个 while 循环来在进程重新启动时继续监视它,但我想你会明白这一点的。
选项 1
逐行输入:
adb shell
su
bash
PKG_PID_LIST_CACHE=$(eval $(pm list packages | cut -d ':' -f 2 | sed 's/^\(.*\)$/echo \"$\(echo \) $\(pidof \)\";/'))
PROC_PID_LIST_CACHE=$(ps -A -o NAME -o PID)
PID_LIST_CACHE=$(echo "$PKG_PID_LIST_CACHE\n$PROC_PID_LIST_CACHE")
function pid2pkg() { pkgName=$(echo "$PID_LIST_CACHE" | grep -w | cut -d ' ' -f1 | head -1); if [ "$pkgName" != "" ] ; then echo $pkgName; else echo "*NOT RUNNING*"; fi }
eval "$(logcat -d | sed -r -e 's/([^ ]+) +([^ ]+) +([^ ]+) +([^ ]+) +(.*)/ $\(pid2pkg \) /g' | sed -r -e 's/(.+)/echo -e \"\"/g')"
logcat 输出将采用以下格式:
[Time] [Name] [Type] [Message]
示例:
14:34:59.386 wpa_supplicant E wpa_supplicant: nl80211: Failed to set IPv4 unicast in multicast filter
14:35:02.231 com.android.phone D TelephonyProvider: subIdString = 1 subId = 1
14:35:03.469 android.hardware.wifi@1.0-service E WifiHAL : wifi_get_logger_supported_feature_set: Error -3 happened.
14:35:03.518 system_server I WifiService: getWifiApEnabledState uid=10086
14:35:03.519 dev.ukanth.ufirewall D AFWall : isWifiApEnabled is false
14:35:03.520 system_server I GnssLocationProvider: WakeLock released by handleMessage(UPDATE_NETWORK_STATE, 0, 123)
14:35:03.522 dev.ukanth.ufirewall I AFWall : Now assuming wifi connection
一些系统进程没有包。例如 system_server
和 wpa_supplicant
。如果找不到包名称,则会显示进程名称。
注意事项:
如果某个PID背后的进程不再是运行ning,你就无法再获取到package/process名称。
进程自行退出或您的设备重启后,PID 实际上可能分配给完全不同的进程。
所以您可能想检查该过程实际持续了多长时间 运行ning:
ps -e -o pid -o stime -o name
选项 2
如果您希望格式更具可读性,您可以将我的日志记录脚本复制到您的设备并执行它:
better_logging.sh
PKG_PID_LIST_CACHE=$(eval $(pm list packages | cut -d ':' -f 2 | sed 's/^\(.*\)$/echo \"$\(echo \) $\(pidof \)\";/'))
PROC_PID_LIST_CACHE=$(ps -A -o NAME -o PID)
PID_LIST_CACHE=$(echo "$PKG_PID_LIST_CACHE\n$PROC_PID_LIST_CACHE")
MAX_LEN=$(echo "$PID_LIST_CACHE" | cut -d ' ' -f1 | awk '{ if ( length > L ) { L=length} }END{ print L}')
function pid2pkg() {
pkgName=$(echo "$PID_LIST_CACHE" | grep -w | cut -d ' ' -f1 | head -1);
if [ "$pkgName" != "" ] ; then
printf "%-${MAX_LEN}s" "$pkgName";
else
printf "%-${MAX_LEN}s" "<UNKNOWN (NOT RUNNING)>";
fi
}
eval "$(\
logcat -d | \
sed -r -e 's/([^ ]+) +([^ ]+) +([^ ]+) +([^ ]+) +(.*)/\ $\(pid2pkg \) /g' | \
sed -r -e 's/(.+)/echo -e \"\"/g' \
)" | \
awk '
function color(c,s) {
printf("3[%dm%s3[0m\n",90+c,s)
}
/ E / {color(1,[=14=]);next}
/ D / {color(2,[=14=]);next}
/ W / {color(3,[=14=]);next}
/ I / {color(4,[=14=]);next}
{print}
'
要复制并运行它,您可以使用:
adb push better_logging.sh /sdcard/better_logging.sh
adb shell "bash /sdcard/better_logging.sh"
输出将如下所示: