Android日志记录级别

Android日志记录级别,android,logging,nexus-one,Android,Logging,Nexus One,我在配置Android日志方面有点困难。我的代码是这样的: if (Log.isLoggable("MY_TAG", Log.VERBOSE)) { Log.v("MY_TAG", "Here's a log message"); } 很简单,对吧 但是,要让Log.isLoggable(“我的标签”,Log.VERBOSE)返回true,我有相当大的困难 根据,我尝试将一个local.prop文件添加到/data/目录,如下所示: log.tag.MY_TAG

我在配置Android日志方面有点困难。我的代码是这样的:

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

但是,要让
Log.isLoggable(“我的标签”,Log.VERBOSE)
返回true,我有相当大的困难

根据,我尝试将一个local.prop文件添加到/data/目录,如下所示:

log.tag.MY_TAG=VERBOSE
但是没有运气。我还尝试:

System.setProperty("log.tag.MY_TAG", String.valueOf(Log.VERBOSE));
但这也不行

你知道我做错了什么吗?我正在Nexus1上运行Android 2.1-update1,如果这有什么不同的话。

试试看

adb shell setprop log.tag.MyAppTag VERBOSE

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

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

static final boolean DEBUG = false;
static final String TAG = "<MyClass>"
通过将
DEBUG
常量更改为true来打开日志。(如果您愿意,您可以使用一个包含这些静态的类来使用所有应用程序的代码……这对于一个小应用程序来说是有意义的,但当事情变得越来越大时,最好决定打开哪些部分的日志记录。)

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

这是许多Android框架采用的方法。比如,


这些常量位于顶部,并根据它们在各处散布各种日志行。(由于这个文件大得不可思议,所以它的各个方面都有一堆其他的子调试常量。)

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也可以工作。问题是重新启动后属性值会丢失。

这是有效的!!!如果您可以通过Java中的System.setProperty调用来更改这些shell属性,那就太好了。因此,如果需要,您必须再次输入该命令。如果您有app Tasker(Play Store上的几美元),您可以在设备启动时运行该命令,方法是使用event=System>device Boot and task Code>run Shell with command=“setprop log.tag.MyAppTag VERBOSE”。我必须以root用户身份运行该命令(选中Tasker中的复选框)才能使其正常工作。请注意,在最新版本的开发工具(肯定是R20及更高版本)上,您可以使用
BuildConfig.DEBUG
,而不是您自己的
DEBUG
。@hackbod那么,当测试人员报告某件事情时,我们将如何,看看日志,希望能找到什么?最好在运行时启用DEBUG,但如何实现呢?有没有一种方法可以对所有日志标记执行此操作,而不必明确列出每个日志标记?我正在开发一个应用程序,其中标签通常设置为类名,因此有很多标签。
adb shell getprop | grep log.tag