如何让 slf4j-android 遵守 Logcat 日志记录级别



我通过gradle/maven使用slf4j-android 1.6.1-RC1,当我调用Log.debug时,当我在模拟器中运行应用程序时,Android Studio 0.3.5下的Logcat中没有任何结果。

只是为了好玩,我尝试了以下内容:

private final Logger Log = LoggerFactory.getLogger(MainActivity.class);
        ...
Log.debug("Got this far, woohoo!");
android.util.Log.d("blah","I am here!");

Log.d的输出确实出现在Logcat中,但Log.debug没有。

我检查了 Log.isDebugEnabled(),果然它设置为 false。但这似乎很奇怪,因为android.util.Log.d工作得很好。slf4j 不应该使用相同的日志级别吗?事实上,slf4j不应该只是在幕后调用android.util.Log吗?

我还用Log.error替换了Log.debug,这确实有效。所以问题似乎是 slf4j 以某种方式决定不应发出调试事件,即使 Log.d 会发出它们。

如何让 slf4j 像 android.util.Log 一样遵守 Android Studio 中 Logcat 中设置的日志级别?

如果你查看slf4j-android的源代码,你可以看到它调用android.util.Log#isLoggable来决定是否应该进行日志条目。isLoggable的javadoc说(我的强调):

检查指定标记的日志是否可记录 在指定的级别。任何标记的默认级别都设置为 INFO。 这意味着将记录高于(包括 INFO)的任何级别。 在对日志记录方法进行任何调用之前,您应该检查以查看 是否应记录您的标记。您可以通过以下方式更改默认级别 设置系统属性:"设置Prop log.tag。' 其中级别为详细、调试、信息、警告、错误、断言或 抑制。SUPPRESS 将关闭代码的所有日志记录。您可以 还要创建一个包含以下内容的 local.prop 文件: 'log.tag.=' 并将其放在/data/local.prop 中。

因此,默认情况下调用 slf4j 的Logger.debug将不执行任何操作。另一方面,android.util.Log.d 不会调用 isLoggable ,因此会创建日志条目。

javadoc中提到的选项都不是可口的,这使得slf4j的Logger.debug不太有用。如果记录器可以通过编程配置为忽略isLoggable,那就太好了,但在撰写本文时它不能。

参见 Log.isLoggable 是否返回错误的值?

我发现这个版本更容易使用:http://noveogroup.github.io/android-logger/

您可以在android-logger.properties配置文件中设置所需的日志级别。它并不完全遵守 Logcat 日志级别,但至少您可以在使用 slf4j-android 时显示调试消息而不会弄乱setprop

您还可以

使用 https://github.com/mvysny/slf4j-handroid - 一个在开发阶段记录调试消息的特殊分支; 它还包含Android Studio 1.5中不记录某些异常的错误解决方法。

这对

我有用。若要将名为 LoggerFactory.getLogger(MyClass.class 的类的默认 INFO 级别更改为 DEBUG,请在命令行中键入以下命令:

adb shell setprop log.tag.MyClass DEBUG

然后 MyClass 的所有 DEBUG 和更高的输出都将在 logcat 中。

最新更新