8

我正在通过 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 中设置的日志级别?

4

4 回答 4

6

如果您查看 slf4j-android 的源代码,您会看到它调用android.util.Log#isLoggable来决定是否应该创建日志条目。javadoc forisLoggable说(我的重点):

检查指定标签的日志是否可在指定级别记录。任何标签的默认级别都设置为 INFO。这意味着将记录任何高于并包括 INFO 的级别。在调用记录方法之前,您应该检查是否应该记录您的标签。您可以通过设置系统属性来更改默认级别:'setprop log.tag。' 其中 level 是 VERBOSE、DEBUG、INFO、WARN、ERROR、ASSERT 或 SUPPRESS。SUPPRESS 将关闭您的标签的所有日志记录。您还可以创建一个包含以下内容的 local.prop 文件:'log.tag.=' 并将其放在 /data/local.prop 中。

所以默认调用 slf4jLogger.debug不会做任何事情。另一方面,android.util.Log.d不调用isLoggable,因此生成了日志条目。

javadoc 中提到的选项都不是可口的,这反而使 slf4j 的Logger.debug用处不大。如果可以将记录器以编程方式配置为 ignore ,那就太好了isLoggable,但在撰写本文时它不能。

另请参阅Log.isLoggable 是否返回错误值?

于 2014-06-14T08:00:14.233 回答
1

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

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

于 2014-07-25T09:19:31.410 回答
1

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

adb shell setprop log.tag.MyClass DEBUG

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

于 2020-05-07T21:12:48.047 回答
0

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

于 2015-11-26T07:42:52.463 回答