26

我在配置 Android 日志记录时遇到了一点困难。这是我的代码的样子:

    if (Log.isLoggable("MY_TAG", Log.VERBOSE)) {
        Log.v("MY_TAG", "Here's a log message");
    }

很简单,对吧?

但是,我在Log.isLoggable("MY_TAG", Log.VERBOSE)返回 true 时遇到了很大的困难。

根据http://developer.android.com/reference/android/util/Log.html,我尝试将 local.prop 文件添加到 /data/ 目录,如下所示:

log.tag.MY_TAG=VERBOSE

但没有运气。我也试过:

System.setProperty("log.tag.MY_TAG", String.valueOf(Log.VERBOSE));

但这也不起作用。

关于我在这里做错了什么的任何想法?如果这有什么不同,我正在 Nexus 1 上运行 Android 2.1-update1。

4

3 回答 3

31

尝试

adb shell setprop log.tag.MyAppTag VERBOSE
于 2010-11-08T18:48:14.073 回答
24

似乎更高版本的 Android 只想/data/local.prop由 root 写入。该adb push命令似乎最初创建文件时授予每个人读/写访问权限(因为默认文件掩码是777)。Android 明智地忽略了这一点,/data/local.prop因为这可能会带来安全风险。

我只尝试过 Android 2.3.3 和 4.1.2。前者在读取世界可写的文件时没有问题local.prop,而后者似乎默默地忽略了文件的内容。

local.prop如原始问题中所述创建文件:

log.tag.MY_TAG=VERBOSE

然后按如下方式将其推送到设备上似乎可以解决问题:

adb push local.prop /data/local.prop
adb shell chmod 644 /data/local.prop
adb shell chown root.root /data/local.prop
adb reboot

您可以仔细检查以确保local.prop通过执行以下操作读取了中的值:

adb shell getprop | grep log.tag

总而言之:

  • /data/local.prop仅在引导期间读取。
  • 更高版本的 Android 似乎要求/data/local.prop必须正确设置文件的权限,否则将无法读取。该文件必须只能由 root 写入。

使用adb shell setprop log.tag.MyAppTag VERBOSE也可以。问题是重新启动后属性值会丢失。

于 2013-09-01T08:59:21.303 回答
9

一个重要的目标是不要发布带有大量日志调用的生产应用程序,从而增加其大小,甚至可能影响其性能。

为此,我的建议是将这些常量放在将进行日志调用的每个类的顶部:

static final boolean DEBUG = false;
static final String TAG = "<MyClass>"

现在您登录的地方,请执行以下操作:

if (DEBUG) Log.v(TAG, "Something");

DEBUG通过将常量更改为 true 来打开日志。(如果你愿意,你可以为你的应用程序的所有代码使用一个具有这些静态的类......这对于一个小应用程序来说是有意义的,但是随着事情变得越来越大,决定打开哪些部分来登录是很好的。)

通过这样做,当您使用 构建您的应用程序时DEBUG = false,您的所有日志记录代码不仅不会执行,而且会完全从您的应用程序中删除。这很好,因为它允许您在代码中留下相当广泛的日志记录,以便在需要时打开,而不必担心这将如何影响您的运输应用程序的大小。基本上只需将日志放在您需要它们的地方,而不必担心将它们留在里面。

这是许多 Android 框架采用的方法。例如,活动管理器服务

这在顶部有这些常量,并且基于它们散布了各种日志行。(以及它的各个方面的一堆其他子调试常量,因为这个文件非常愚蠢地大。)

于 2010-11-08T21:55:09.183 回答