安卓日志级别

27

我在配置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的说明,我尝试在/data/目录下添加一个名为local.prop的文件,其内容如下:

log.tag.MY_TAG=VERBOSE

但是没有成功。我也尝试了:

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

但是那也不起作用。

对于我在这里做错了什么,有任何想法吗?如果对结果有影响的话,我在 Nexus 1 上运行 Android 2.1-update1。

3个回答

31

试一试

adb shell setprop log.tag.MyAppTag VERBOSE

2
这个可行!!! 如果你能通过Java中的System.setProperty调用来改变这些shell属性,那就太好了。 - seanoshea
1
请注意,像这样设置的属性值在设备重新启动后会重置。因此,如果您需要它,您将不得不再次输入命令。 - Tony Chan
如果您拥有应用程序Tasker(在Play商店上花费几美元),则可以通过创建一个新的事件=系统>设备启动和任务代码>运行Shell的配置文件来使此命令在设备启动时运行,命令为“setprop log.tag.MyAppTag VERBOSE”。我必须以root身份运行该命令(在Tasker中选中该框)才能使其正常工作。 - Tony Wickham

26

似乎Android的后续版本希望/data/local.prop文件只能由root用户拥有可写权限。因为默认的文件掩码是777,所以adb push命令似乎最初创建的文件授予所有人读/写访问权限。明智地,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也可以正常工作。问题在于属性值在重新启动后会丢失。


2
有没有一种方法可以针对所有日志标签进行操作,而不需要明确拼写每个标签?我正在开发一个应用程序,其中标签通常设置为类名,因此有很多标签。 - Mark McClelland

9
重要的目标是不要在生产应用程序中留下大量的日志调用,增加其大小,甚至可能影响其性能。
为了做到这一点,我的建议是将这些常量放在每个将具有日志调用的类的顶部:
static final boolean DEBUG = false;
static final String TAG = "<MyClass>"

现在你登录的地方,做这个:
if (DEBUG) Log.v(TAG, "Something");

DEBUG常量更改为true以打开日志记录。(如果您愿意,您可以有一个类,其中包含所有应用程序代码使用的这些静态内容...对于小型应用程序来说是有意义的,但随着事物变得庞大,决定哪些部分打开日志记录非常好。)
通过这样做,当您使用DEBUG = false构建应用程序时,所有日志记录代码不仅不执行,而且完全从应用程序中删除。这很好,因为它允许您在需要时保留相当广泛的日志记录,并且不必担心这将如何影响您的出货应用程序的大小。基本上,只需在需要它们的任何位置放置日志记录即可,不必担心留下它们。
这是许多Android框架采用的方法。例如,Activity ManagerService

这个文件顶部有一些常量,并根据它们在各处添加了各种日志行。(由于这个文件非常大,还有许多其他子调试常量用于各个方面。)


6
请注意,在最近的开发工具版本(肯定在R20及以上版本)中,您可以使用BuildConfig.DEBUG而不是您自己的DEBUG - CommonsWare
1
@hackbod那么当测试人员报告问题时,我们如何查看日志并期望找到任何东西呢?最好在运行时打开DEBUG模式-但是如何做到呢? - likejudo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接