【问题标题】:Why is this code wrong?为什么这段代码是错误的?
【发布时间】:2013-09-05 14:16:32
【问题描述】:

我正在将代码从 Log4J 迁移到由 logback 1.0.13 支持的 slf4j。

如何将以下代码翻译成 slf4j?

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    // ...  

    ConsoleAppender stderr = new ConsoleAppender();
    stderr.setTarget(ConsoleAppender.SYSTEM_ERR);
    stderr.setLayout(layout);
    stderr.addFilter(new CurrentThreadLogFilter());
    stderr.setThreshold(Level.INFO);
    stderr.activateOptions();

    Logger loggerRECORD = getLoggerRECORD();
    loggerRECORD.setLevel(Level.ALL);
    loggerRECORD.setAdditivity(false);
    loggerRECORD.addAppender(stderr);

    Logger root = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
    root.setLevel(Level.WARN);
    root.addAppender(stderr);

    // ...

    private Logger getLoggerRECORD() {
         return LoggerFactory.getLogger("com.company.MyClass");
    }

我不知道用什么来代替 setLeveladdAppendersetAdditivity 方法。

【问题讨论】:

  • 我认为 SLF4J Logger 接口不支持您正在寻找的方法,因为它们是特定于实现的。实际实现(Logback 中的 Logger 类)支持 setLevel() 和 setAdditive()。 getLoggerRECORD() 方法有什么作用?它总是返回一个 Logback 记录器吗?
  • @DariusX。我已经更新了我的问题

标签: java log4j migration slf4j logback


【解决方案1】:

AFAIK,如果你想成为“纯 SLF4J”,你不能(也不应该)通过代码配置你的记录器。配置细节是特定于实现的。 (参考:slf4 FAQ

如果你确定要使用 Logback,你有两个选择:

  1. 在代码之外使用特定于 Logback 的配置文件;或者,

  2. 当您获得您的 Logger(来自 LoggerFactory)时,您知道它是 将是一个 Logback 实现。所以,把它投射到那个,然后 在接口之上使用它支持的额外方法 SLF4J。

第一个(配置文件)更容易更改。我建议走那条路。

如果您想走第二条路线,您可以更改导入,以便我们处理来自 Logback 的实际类,而不是来自 SLF4J 的接口。此外,您可以在 LoggerFactory 返回 Logger 时添加强制转换。

完成此操作后,您会发现 Logger 类现在支持您正在寻找的 setLevel() 和 setAdditive() 方法。请参阅Logback javadocs 了解更多信息。

【讨论】:

  • 我会去第一条路线。
  • 注意,如果logback.xml文件不够表达,可以使用Groovy。这应该允许你做任何你想做的事情。
猜你喜欢
  • 2011-10-07
  • 1970-01-01
  • 2017-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多