我通过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 中。