可分发库中的SLF4J,如何获取Logger

6

我希望分发一个依赖于 SLF4J 日志接口的库。什么是最佳实践方法来获得与任何其他项目良好集成的记录器?抱歉问题风格不够结构化,我还在尝试弄清楚所有这些东西如何粘合在一起。

在其他项目中,我总是使用这段代码,因为我想获取自定义记录器:

private final static Logger LOGGER = LoggerFactory.getILoggerFactory().getLogger(NAME_OF_APP);

如果我创建了类org.slf4j.impl.StaticLoggerBinder并将其放在其他库中,即使我只调用LoggerFactory.getLogger(NAME_OF_APP),其中定义的工厂是否会被使用?还是会使用一些默认的slf4j工厂?
我希望用户能够使用自己的工厂和记录器,那么哪种方式更好,最重要的是为什么?
4个回答

3
我不确定我完全理解你想做什么。
SLF4J由两部分组成。首先是API,您在库中使用它来编写日志调用。其次是实现,在开发过程中用于记录日志,但不将其设置为库的依赖项。
因为SLF4J在类路径上查找实现,使用我们的库的开发人员可以简单地包括任何他们想要的实现。有时是以一些相当奇怪的方式 :-) 他们可以使用一系列预构建的实现或编写自己的实现。由他们决定。
我认为您无需做任何其他事情,只需按原样使用SLF4J的API即可。

谢谢,但我还不太明白调用 LoggerFactory.getLoggerLoggerFactory.getILoggerFactory().getLogger 之间的区别在哪里? - Franz Kafka
1
不需要深入了解API - 我有很多第一个,但没有第二个。我会怀疑LoggerFactory.getLogger已经为您处理了这个问题,您不需要担心它。除非您正在做一些非常奇怪的事情,否则不需要编写工厂。 - drekka

2

From http://slf4j.org/manual.html

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

public class HelloWorld {
  public static void main(String[] args) {
    Logger logger = LoggerFactory.getLogger(HelloWorld.class);
    logger.info("Hello World");
  }
}

因此,始终使用LoggerFactory.getLogger(...)。参数允许记录器后端确定返回给您的记录器的行为。

0

我不确定我完全理解你的情境。

但从我的角度来看,你想要的是一个分布式日志组件。

一个简单的方法是使用套接字附加器。而一个完整功能的分布式日志组件可能像Facebook的scribe。


0

使用jcabi-log中的Logger静态包装器:

import com.jcabi.log.Logger;
public class MyLibraryClass {
  public void foo() {
    Logger.info(this, "some information");
  }
}

所有日志都将通过SLF4J发送。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接