1

假设我想为我的逻辑的每个部分创建一个带有不同记录器的应用程序,即一个用于常见消息的 ConsoleLogger 和一个用于远程通信的 HttpLogger。

我已经看到 Timber 允许您创建从 Timber.Tree 扩展的不同记录器。然后,可以通过修改您自己的应用程序子类的 onCreate 方法,根据 Android 变体(DEBUG 与 RELEASE)来决定使用哪个记录器。此外,可以通过使用日志记录级别(d、i、w 等)来配置 Timber 使用一个记录器或另一个。

现在,我的问题是,是否可以在运行时告诉 Timber 使用哪棵树? 如果有帮助,我正在尝试做一些类似于logback-android对 slf4j 所做的事情:

org.slf4j.Logger log = LoggerFactory.getLogger(MainActivity.class);
4

3 回答 3

1

您可以同时运行任意数量的记录器。所以不同的实现可以在d, i, v日志中做不同的事情。如果您确实需要在运行时停止一个记录器的运行,您可以使用uproot(Tree tree)uprootAll()方法来删​​除记录树。如果你还没有添加新的,你会使用plant(Tree... trees).

于 2018-01-24T13:57:04.637 回答
0

我建议以不同的方式处理它,而不是不断地搞乱树木。

如果您只想HttpLogger记录 http 日志,您可以创建记录器以检查消息的标签是什么,并仅在消息包含预期标签的情况下记录它。当然,您需要手动将该标签放在您记录 http 消息的位置。但是由于#android标签的问题,我猜你正在使用Retrofit,所以你可以使用拦截器将请求记录在一个地方。

abstract class RemoteLoggerTree : Timber.Tree() {

  companion object {
    const val TAG_HTTP_LOG = "TAG_HTTP_LOG"
  }

  override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {
    if (tag != TAG_HTTP_LOG) {
      return
    }
    
    // log your stuff here as usual
    }
}

然后在调用站点上,您只需要在记录之前设置一个标签,就像这样。它将仅应用于一个日志调用。

  Timber.tag(TAG_HTTP_LOG)
  Timber.d("Your message goes here and will be logged in the HTTP logger")

如果您不想让两个记录器重复日志,则可以对不需要记录这些标记消息的记录器执行相反的操作。

于 2021-12-18T23:54:50.920 回答
0

签出Timber.forest(),这将返回所有种植树木的集合。

于 2020-10-11T09:40:02.567 回答