【问题标题】:Which Android logging framework to use? [closed]使用哪个 Android 日志框架? [关闭]
【发布时间】:2012-05-17 20:31:40
【问题描述】:

我的问题似乎很容易回答,但有几个很好的解决方案。 我喜欢选择“最好的”。

可用的框架(欢迎提出更多建议):

优点/缺点:

雄鹿:

  • Pro:类似于Android日志框架,所以对现有代码只有很小的改动;能够在错误报告中发送更详细的崩溃报告(异常日志);不错的原木
  • 缺点:没有标准的 java“getLogger”方法;通过将属性文件上传到 sdcard 可实现生产配置;我需要手动调用初始化日志;需要创建 LOG_TAG 类常量,或者通过 Aspect 破解它来创建日志标签常量以实现标准行为:标签是类名;当日志记录是一项业务需求时,我们需要对其进行测试。在 Android 上测试静态调用几乎是不可能的;记录器不能被框架注入

Log4J-Android:

  • Pro:标准的 Java 登录方式;与 SLF4J 兼容;能够解析属性文件;
  • Con:没有内置崩溃报告系统;在我看来:它不常用,所以使用它可能会很危险;

SLF4J-Android:

  • Pro:好像是Log4J-Android等更多人开发的;如果记录器关闭,logger.debug("Some log message. Details: {}", someObject.toString()); 是跳过字符串连接的好方法;委托给android.util.Log的轻量级记录器绑定。
  • Con:由于 Android 平台上日志标签的长度限制(例如,com.example.myapp.MyClass 标签转换为 c*.e*.m*.MyClass),自动生成的日志标签长度为 com.example.app.MyClass 和 com.example.anotherapp.MyClass 都转换为 c*.e*.a*.MyClass);没有内置崩溃报告系统。

除此之外,我喜欢 Androlog 的行为,但我是一名 Java 开发人员,熟悉 log4j/slf4j。 我们肯定需要崩溃报告系统,但是有几个崩溃报告框架(除了android默认的崩溃报告)。

我可以组合其中的一些,例如使用Log4J android,但是创建一个appender来使用androlog框架,但迟早会变得一团糟,应该避免。

感谢您的建议,希望结果对以后决定其他人有所帮助。

编辑:如下所述,我可以将例如:log4j-android 与 slf4j 结合使用(如果我将使用 log4j,我更喜欢这样做,因为日志格式支持 ("{}",...) ),但它没有回答这个问题。我必须选择一个框架,然后我可以用 SLF4J 外观装饰它。

【问题讨论】:

  • 根据您的描述,Androlog 听起来最好,但我看到它需要 Maven。我犹豫要不要在我的设置中添加另一个依赖项而没有显着的好处。
  • 没有提到 Android 内置的日志框架?
  • 23 个字符的限制不是 SLF4J 的缺点,而是 Android 的限制。其他日志框架也无法做到这一点。至少 SLF4J,在文档中提到它,并试图缩短它。
  • 如果你使用的是kotlin,也可以使用:github.com/MicroUtils/kotlin-logging

标签: android logging log4j slf4j


【解决方案1】:

我尝试过original slf4j.org-android,但不幸的是,这个 jar 无法获取要记录的调试/详细消息,因为它在内部使用 LOG.isDebugEnabled() 进行调试输出,这似乎总是错误的。

目前我使用替代的lp0-slf4j-android 实现,它使用带有日志记录设置的属性文件,如果启用,我还可以获得调试/详细消息。

【讨论】:

  • 关于 isDebugEnabled() 总是返回 false。 Android 上的默认日志级别是 Info。如果您想从自己的日志中查看更多输出,则需要显式启用调试日志记录。请参阅:developer.android.com/tools/debugging/debugging-log.htmldeveloper.android.com/reference/android/util/Log.html。基本上,如果您想看到 isDebugEnabled() 返回 true,则必须在运行时启用调试或详细日志记录。
  • 如何在运行时启用isDebugEnabled()==true?在您提供的链接中没有找到有关该主题的信息。只要原始 slf-original 依赖于 isDebugEnabled() 而我无法在运行时启用它,它对我来说毫无用处。
  • 我专门为此目的创建了github.com/mvysny/slf4j-handroid,以避免修改 Android 设置。
【解决方案2】:

请查看this第一答案

上面写着:

SLF4J 基本上是一个抽象层。这不是日志记录 执行。这意味着如果你正在编写一个库并且你使用 SLF4J,您可以将该库提供给其他人使用,他们可以 选择与 SLF4J 一起使用的日志记录实现,例如log4j 或 Java 日志记录 API。它有助于防止项目依赖 在很多日志 API 上,仅仅因为它们使用的库 依赖他们。

所以,总结一下:SLF4J 不会取代 log4j,它们是一起工作的。它 从您的库/应用程序中删除对 log4j 的依赖。

【讨论】:

  • 好的,我知道了。问题是 SLF4J-android 库与 Log4J-android 不直接兼容,它们都包含实现。 (但从一个更改为另一个很容易)。检查项目的链接。
  • 嗨 Marcell,Androlog 是我的首选,但正如你所说,它没有 java 之类的 getLogger 方法,我认为结合其中一些框架会更好。
  • 我链接的 repo 是一个简单的 SLF4J Logger 包装库,使用 Androlog 作为输出。这样,您就可以从 LoggerFactory.getLogger() 获得包装好的 Logger。我的偏好也是 Androlog。见:github.com/kovmarci86/slf4j-androlog/blob/master/slf4j-androlog/…
  • 从中获得了更多信息,但我正在寻找记录器库,它将收集所有日志和更新到服务器/云或文件中,这真的很有帮助!我想我需要将它作为一个单独的问题发布!
【解决方案3】:

更好的方法。我想,就是使用 SLF4J API + 它的一些实现。

对于 Android 应用程序,您可以使用以下内容:

  1. Android Logger 是轻量级但易于配置的 SLF4J 实现 (
  2. LOGBack 是最强大和优化的实现,但它的大小约为 1 Mb。
  3. 其他任何您喜欢的:slf4jandroidslf4j-android

【讨论】:

猜你喜欢
  • 2010-09-16
  • 2013-12-11
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多