Android日志记录级别

sea*_*hea 25 logging android nexus-one

我在配置Android日志时遇到了一些困难.这是我的代码的样子:

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

很简单吧?

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

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

log.tag.MY_TAG=VERBOSE
Run Code Online (Sandbox Code Playgroud)

但没有运气.我也尝试过:

System.setProperty("log.tag.MY_TAG", String.valueOf(Log.VERBOSE));
Run Code Online (Sandbox Code Playgroud)

但这也不起作用.

关于我在这里做错了什么的想法?我在Nexus 1上运行Android 2.1-update1,如果这有任何区别的话.

Emm*_*uel 30

尝试

adb shell setprop log.tag.MyAppTag VERBOSE
Run Code Online (Sandbox Code Playgroud)

  • 这个工作!!! 如果你可以通过Java中的System.setProperty调用来改变这些shell属性,那将是非常好的. (2认同)

ped*_*hdz 22

似乎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
Run Code Online (Sandbox Code Playgroud)

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

adb push local.prop /data/local.prop
adb shell chmod 644 /data/local.prop
adb shell chown root.root /data/local.prop
adb reboot
Run Code Online (Sandbox Code Playgroud)

您可以仔细检查以确保local.prop通过执行以下内容读取值:

adb shell getprop | grep log.tag
Run Code Online (Sandbox Code Playgroud)

总结如下:

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

使用adb shell setprop log.tag.MyAppTag VERBOSE也工作.问题是重启后属性值会丢失.

  • 有没有办法为所有日志标记执行此操作,而无需明确说明每个日志标记?我正在开发一个应用程序,其中标记通常设置为类名,因此有很多标记. (2认同)

hac*_*bod 9

一个重要的目标是不发布生产应用程序,其中包含大量的日志调用,增加其大小,甚至甚至可能影响其性能.

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

static final boolean DEBUG = false;
static final String TAG = "<MyClass>"
Run Code Online (Sandbox Code Playgroud)

现在您在哪里记录,执行以下操作:

if (DEBUG) Log.v(TAG, "Something");
Run Code Online (Sandbox Code Playgroud)

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

通过这样做,当您使用构建应用程序时DEBUG = false,您的所有日志记录代码不仅不会被执行,而且会完全脱离您的应用程序.这很好,因为它允许您在代码中保留相当广泛的日志记录,以便在需要时打开,而不必担心这将如何影响您的运送应用程序的大小.基本上只需将日志放在任何需要它们的地方,并且不用担心让它们进入.

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

这个常量位于顶部,各种日志线基于它们分散.(以及它的各个方面的一堆其他子调试常量,因为这个文件非常愚蠢.)

  • 请注意,您可以在最新版本的开发工具(绝对在R20及更高版本中)使用`BuildConfig.DEBUG`而不是您自己的`DEBUG`. (6认同)