【问题标题】:Android logging levelsAndroid 日志记录级别
【发布时间】:2011-05-06 19:46:04
【问题描述】:

我在配置 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。

【问题讨论】:

    标签: android logging nexus-one


    【解决方案1】:

    试试

    adb shell setprop log.tag.MyAppTag VERBOSE
    

    【讨论】:

    • 这行得通!!!如果您可以通过 Java 中的 System.setProperty 调用来更改这些 shell 属性,那就太好了。
    • 记住在设备重启后设置的属性值会重置。因此,如果需要,您必须再次输入该命令。
    • 如果您有应用 Tasker(Play Store 上的几块钱),您可以在设备启动时运行此命令,方法是使用 event=System>Device Boot and task Code> 创建新配置文件>使用 command="setprop log.tag.MyAppTag VERBOSE" 运行 Shell。我必须以 root 身份运行该命令(选中 Tasker 中的框)才能使其工作。
    【解决方案2】:

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

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

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

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

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

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

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

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

    这些常量在顶部,各种日志行基于它们散布在各处。 (以及它的各个方面的一堆其他子调试常量,因为这个文件大得离谱。)

    【讨论】:

    • 请注意,您可以在最新版本的开发工具(绝对是 R20 及更高版本)上使用BuildConfig.DEBUG,而不是您自己的DEBUG
    • @hackbod 那么,当测试人员报告某些内容时,我们将如何查看日志并期望找到任何内容?最好在运行时打开 DEBUG - 但是如何?
    【解决方案3】:

    似乎更高版本的 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 也可以。问题是重启后属性值会丢失。

    【讨论】:

    • 有没有办法对所有日志标签执行此操作,而无需明确拼写每个标签?我正在开发一个标签通常设置为类名的应用程序,因此有很多标签。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2014-01-22
    相关资源
    最近更新 更多