2010-11-08 185 views
22

我在配置Android日志记录方面有点困难。以下是我的代码的样子: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,如果这有什么区别的话。

回答

30

尝试

adb shell setprop log.tag.MyAppTag VERBOSE 
+2

This Works !!!如果您可以通过Java中的System.setProperty调用来更改这些shell属性,那将非常可爱。 – seanoshea 2010-11-09 21:25:15

+1

请记住设备重新启动后重置的属性值。所以如果你需要的话,你必须再次输入命令。 – 2014-10-01 23:22:24

+0

如果您有应用程序Tasker(Play商店中有几块钱),您可以在设备引导时通过创建一个新的配置文件来运行此命令,该配置文件包含event = System> Device Boot和任务代码> Run Shell with command =“setprop log.tag.MyAppTag VERBOSE“。我必须以root身份运行该命令(勾选Tasker中的方框)才能使其运行。 – 2015-01-16 08:12:00

9

一个重要目标是不发货一吨留在它的日志呼叫的生产程序,提高其规模,甚至可能影响甚至它的性能。

要做到这一点,我的建议是把这些常量在每个类的是将有日志调用上:

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

现在,你登录,这样做:

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

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

通过这样做,当您使用DEBUG = false构建应用程序时,您的所有日志记录代码不仅不会被执行,还会被完全剥离出您的应用程序。这很好,因为它允许您在代码中保留相当广泛的日志记录,以便在需要时启用它,而不必担心这会如何影响运输应用程序的大小。基本上只需要在任何需要它们的地方扔日志,不用担心把它们留在里面。

这是很多Android框架所采用的方法。例如,Activity ManagerService

这些常数位于顶部,各种日志行都基于它们洒落。 (以及其他各种子调试常量,因为这个文件是荒谬的愚蠢地大。)

+5

请注意,您可以在最新版本的开发工具(绝对在R20及更高版本)中使用'BuildConfig.DEBUG',而不是您自己的'DEBUG'。 – CommonsWare 2012-12-11 15:59:40

+1

@hackbod那么当测试人员报告某些内容时,我们将如何查看日志并期望找到任何内容?在运行时打开DEBUG会更好 - 但是如何? – likejiujitsu 2015-06-09 15:26:43

17

看来,更高版本的Android希望/data/local.prop只能写入根。 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也工作。问题是重新启动后属性值会丢失。

+2

是否有办法为所有日志标记执行此操作,而不是明确地指出每个日志标记?我正在研究一个标签通常设置为类名的应用程序,因此有很多标签。 – markproxy 2015-03-19 21:46:27