设置 Android 日志级别

Posted

技术标签:

【中文标题】设置 Android 日志级别【英文标题】:Setting Android Log Levels 【发布时间】:2012-05-04 13:42:46 【问题描述】:

是否可以在未植根的设备上设置日志级别? 所以我想以某种方式将设备日志级别更改为“调试”。这是可以做的吗?

由于它没有扎根,我认为 setprop 不会起作用。 我也不能更改 local.prop 文件,因为我没有这样做的权限。

除了可能幸运并找到一个包含日志级别的隐藏菜单之外。 有没有其他方法可以提高日志级别?

感谢您的帮助。

【问题讨论】:

什么“设备日志级别”?并且 setprop 不仅限于有根电话 afaik(减去只读属性) 我注意到在非 root 设备上,有一些属性要么从 android 系统属性中丢失,要么不允许使用 setprop 来修改这些属性。换句话说, setprop 命令有效,但更改不成立。因此,是否有另一种方法可以在这个特定的 android 设备上设置日志级别?总而言之,如果普通的 android 设备的日志级别设置为“信息”,我可以将这些日志级别更改为“调试”吗? 【参考方案1】:

让我建议一个标准日志类的小替代品(我是作者)

https://github.com/zserge/log

它向后兼容,因此您只需要修改您的导入。然后您可以通过Log.level(Log.D)Log.level(Log.W) 等为您的应用设置最低日志级别,或者您可以使用Log.useLog(false) 禁用日志。无需修改现有的日志记录代码。

尽管它的体积很小,但该记录器可同时与 JVM 和 Android 一起使用,允许您跳过“tag”参数,简化以逗号分隔或使用格式字符串的多个值的记录。所以它真的很方便,很容易迁移到,并且只增加了大约 4 KB 的 APK 大小。

【讨论】:

【参考方案2】:

setprop:

在您重新启动设备之前是暂时的,即使是在有根手机上也是如此。 如果您将属性写入local.prop,则可以通过重新启动保留属性,这仅适用于有根手机。 某些属性是只读的,只有在更改某些 init 文件时才能更改。这在有根手机上甚至是不可能的。 每个设备(或固件)可以有一组不同的属性。有根手机不会自动拥有更多功能。

日志级别:

如果打印日志的代码显示Log.d(),那么它将处于“调试”级别,除非您更改代码并重新编译它,否则您无法更改它。如果您执行Log.?,无论级别如何,都不会隐藏日志消息。 如果您有固件的发布版本,Android 框架会隐藏一些日志消息。要显示这些,您需要将固件重新编译为调试版本。也没有机会让那些显示在有根手机上。 某些消息由代码中的局部变量控制,例如 if (LOCAL_LOGV) Log.v(... - 您也需要在此处更改代码才能看到这些消息。 一些消息由Config.LOGV 控制(= 总是false)参见Config。也没有办法改变这里的破坏行为。您需要重新编译。 在您启用某个属性之前,其他一些日志消息会被隐藏:

例子

public static final boolean DEBUG_SQL_CACHE =
Log.isLoggable("SQLiteCompiledSql", Log.VERBOSE); 

// somewhere in code
if (SQLiteDebug.DEBUG_SQL_CACHE) 
    Log.d(TAG, "secret message!");

如果您执行adb shell setprop log.tag.SQLiteCompiledSql VERBOSE,您应该会看到这些消息弹出。 Log#isLoggable()

据我所知,没有全局日志级别。

【讨论】:

首先感谢 411。我真的很感激。我想有没有办法找出日志级别的设置?对于设备上的特定应用程序,例如制造商用于调用 UI 菜单的内容。然后在该 UI 菜单调用上使用 setprop 将其设置为详细?最后使用 logcat 来查看该特定 UI 菜单的所有错误情况? 如果您可以访问应用程序的源代码(或 apk + decompiler),那么您可以检查是否有可以启用的日志记录,例如通过setprop - 您甚至可以尝试使用apktool 编辑源代码并自己添加一些日志记录。或者您可以使用 DDMS(您可能需要使用 apktool 制作应用程序 debuggable)。但是没有通用的方法来启用日志 即使我能够做到这一点,我也无法在设备中获取该应用程序,因为它没有植根。我知道在某些情况下,制造商会在他们的设备上留下调试日志级别,以便在网络现场测试中遇到麻烦,我假设因为他们在启用日志记录时到处使用 log.d,所以只是启用了这个调试级别。我想我什至在检查状态以查看可用的日志级别方面都不走运,除非我像你说的那样进入每个 apk 并单独检查它会很难。 有 init loglevel (elinux.org/Android_Debugging),它可能是“全局 loglevel”的一个很好的候选者,因为 init 在启动后保持不变,它的 loglevel 设置会影响所有服务。

以上是关于设置 Android 日志级别的主要内容,如果未能解决你的问题,请参考以下文章

android studio日志问题见图。

怎么设置日志级别

XCGLogger - 如何设置所有日志的日志级别

在android程序中,log.w用于输出啥级别的日志信息

如何在 Android 中启用/禁用日志级别?

log4j输入日志都有哪些级别设置