如何通过应用程序过滤 Android logcat?

如何通过应用程序过滤 Android logcat 输出?我需要这个,因为当我附加一个设备,我不能找到我想要的输出,由于垃圾邮件从其他进程。

196564 次浏览

编辑: 原件在下面。当一个 Android 工作室还不存在的时候。但是如果你想过滤你的整个应用程序,我会使用 pidcat 的终端查看或 Android 工作室。使用 pidcat 而不是 logcat,那么标记就不需要是应用程序。你可以用 pidcat com.your.application调用它

你应该使用你自己的标签,看看: http://developer.android.com/reference/android/util/Log.html

喜欢。

Log.d("AlexeysActivity","what you want to log");

然后当您想要读取日志时,使用 >

adb logcat -s AlexeysActivity

过滤掉所有不使用相同标签的内容。

使用第一个参数作为应用程序名称。 Log.d("your_Application_Name","message");

在 LogCat 中: create Filter ——-> Filter Name & by Log Tag: 等于‘ your _ Application _ Name’ 它将为您的应用程序创建新的选项卡。

是的,现在你会自动得到它... 。
更新到 AVD 14,其中 logcat 将自动执行 session filter
它在哪里过滤器登录到您的特定应用程序(包)

When we get some error from our application, Logcat will show session filter automatically. We can create session filter by self. Just add a new logcat filter, fill the filter name form. Then fill the by application name with your application package. (for example : my application is "Adukan" and the package is "com.adukan", so I fill by application name with application package "com.adukan")

可以使用这些参数筛选 log cat 输出,以便只显示包中的消息。

软件包: I * : s

编辑,我很快联系上了。

adb com.your.package:v

在 logcat 视图的左侧有“ SavedFilters”窗口。在这里,您可以通过 Application Name (例如 com.your.package)添加一个新的 logcat 筛选器

根据 http://developer.android.com/tools/debugging/debugging-log.html:

下面是一个过滤器表达式的例子,它抑制所有日志消息,除了那些标记为“ ActivityManager”、优先级为“ Info”或更高、以及所有标记为“ MyApp”、优先级为“ Debug”或更高的日志消息:

adb logcat ActivityManager:I MyApp:D *:S

The final element in the above expression, *:S, sets the priority level for all tags to "silent", thus ensuring only log messages with "View" and "MyApp" are displayed.

  • 冗长(最低优先级)
  • 调试
  • I ー信息
  • 警告
  • 错误
  • F — Fatal
  • S-Silent (最高优先级,不打印任何内容)

假设名为 MyApp 的应用程序包含以下组件。

  • 我的活动1
  • 我的活动2
  • 我的活动3
  • 我的服务

为了使用 logcat 过滤应用程序的日志输出,您需要输入以下内容。

adb logcat MyActivity1:v MyActivity2:v MyActivity3:v MyService:v *:s

但是,这要求您知道应用程序中所有组件的 TAG 名称,而不是使用应用程序名称 MyApp 进行筛选。有关详细信息,请参阅 Logcat

允许在应用程序级别进行筛选的一种解决方案是向每个独特的 TAG 添加前缀。

  • MyAppActivity1
  • MyAppActivity2
  • MyAppActivity3
  • MyAppService

现在可以使用 TAG 前缀执行 logcat 输出上的通配符筛选器。

adb logcat | grep MyApp

结果将是整个应用程序的输出。

在我的 Windows 7笔记本电脑上,我使用“ adb logcat | find“ com.example.name”来过滤系统程序相关的 logcat 输出。Logcat 程序的输出通过管道传输到 find 命令。包含“ com.example.name”的每一行都被输出到窗口。双引号是 find 命令的一部分。

为了包含 Log 命令的输出,我在这里使用软件包名称“ com.example.name”,作为 Log 命令中第一个参数的一部分,如下所示:

Log.d("com.example.name activity1", "message");

Note: My Samsung Galaxy phone puts out a lot less program related output 17级模拟器。

我通常做的是有一个单独的过滤器的 PID,这将是当前会话的等价物。当然,每次运行应用程序时它都会发生变化。不是很好,但这是唯一的方式有所有关于应用程序的信息,而不管日志标签。

我在 Android Studio 上工作,有一个很好的选项来获得使用包名称的消息。 在“编辑过滤器配置”上,您可以通过在“按包名称”上添加您的包名称来创建一个新的过滤器。

enter image description here

通常,我在命令行中执行这个命令“ adb shell ps”(允许查看正在运行的进程) ,并且可以发现应用程序的 pid。拿到这个 pid 后,转到 Eclipse 并编写 pid: XXXX (XXXX 是应用程序 pid) ,然后由该应用程序过滤日志输出。

或者,用一种更简单的方式... ... 在 Eclipse 上的 logcat 视图中,搜索与所需应用程序相关的任何单词,发现 pid,然后通过 pid“ pid: XXXX”执行筛选。

如果您能够接受这样一个事实,即您的日志来自一个额外的终端窗口,我可以推荐 野猫(只使用包名并跟踪 PID 更改)

如果您使用 Eclipse,您就能够按应用程序进行筛选,就像 Shadmazumder 提供的 Android Studio 一样。

只要转到 Logcat,点击 显示保存的筛选器视图,然后点击 add new logcat filter。它会显示如下:

enter image description here

然后向筛选器添加一个名称,在 应用程序名称处指定应用程序的包。

要筛选命令行上的日志,请使用下面的脚本

你的软件包:

嗨,我用这个得到了解决方案:

你必须在终端上执行这个命令,我得到了结果,

adb logcat | grep `adb shell ps | grep com.package | cut -c10-15`

Use fully qualified class names for your log tags:

public class MyActivity extends Activity {
private static final String TAG = MyActivity.class.getName();
}

然后

Log.i(TAG, "hi");

那就用 grep

adb logcat | grep com.myapp

把这个放到 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}:"

then: applog.sh com.example.my.package

点击 logcat 中左上角的“ +”按钮,将应用程序的包添加到“ Filter Name”中。

我用它存储在一个文件中:

        int pid = android.os.Process.myPid();
File outputFile = new File(Environment.getExternalStorageDirectory() + "/logs/logcat.txt");
try {
String command = "logcat | grep " + pid + " > " + outputFile.getAbsolutePath();
Process p =  Runtime.getRuntime().exec("su");
OutputStream os = p.getOutputStream();
os.write((command + "\n").getBytes("ASCII"));
} catch (IOException e) {
e.printStackTrace();
}

在 sdk/tools/Monitor 下可用的 Android Device Monitor 应用程序有一个 logcat 选项,可以在输入应用程序包名称的地方过滤“ by Application Name”。

这可能是最简单的解决方案。

On top of a solution from Tom Mulcahy, you can further simplify it like below:

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

Usage is easy as normal alias. Just type the command in your shell:

logcat

别名设置让它很方便。而且正则表达式使其对多进程应用程序非常健壮,假设您只关心主进程。

当然,你可以为每个进程设置更多的别名。或者使用 hegazy 的解决方案。 :)

此外,如果要设置日志记录级别,则为

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

you can achieve this in Eclipse logcat by entering the following to the search field.

app:com.example.myapp

Myapp 是应用程序包的名称。

我的. bash _ profile 函数,它可能有任何用处

logcat() {
if [ -z "$1" ]
then
echo "Process Id argument missing."; return
fi
pidFilter="\b$1\b"
pid=$(adb shell ps | egrep $pidFilter | cut -c10-15)
if [ -z "$pid" ]
then
echo "Process $1 is not running."; return
fi
adb logcat | grep $pid
}


alias logcat-myapp="logcat com.sample.myapp"

Usage:

$logcat-myapp

$ logcat com.android.something.app

On Linux/Un*X/Cygwin you can get list of all tags in project (with appended :V after each) with this command (split because readability):

$ git grep 'String\s\+TAG\s*=\s*' |  \
perl -ne 's/.*String\s+TAG\s*=\s*"?([^".]+).*;.*/$1:V/g && print ' | \
sort | xargs
AccelerometerListener:V ADNList:V Ashared:V AudioDialog:V BitmapUtils:V # ...

它涵盖了定义标记的两种方式:

private static final String TAG = "AudioDialog";
private static final String TAG = SipProfileDb.class.getSimpleName();

And then just use it for adb logcat.

在 Android Studio 的 Android 监视器窗口中: 1. 选择要筛选的应用程序 2. 选择“只显示选定的应用程序”

enter image description here

我在商店里找到了一个应用程序,它可以显示日志的名称/进程。 因为安卓工作室刚刚放置了一个(?)对于其他进程生成的日志,我发现了解哪个进程正在生成这个日志非常有用。但是这个应用程序仍然缺少进程名称的过滤器。你可以找到它 给你