如何让泽西使用SLF4J代替JUL?

yeg*_*256 23 java logging log4j jersey slf4j

我找到了一篇有用的文章,解释了如何让泽西使用SLF4J而不是JUL.现在我的单元测试看起来像(并且它完美地工作):

public class FooTest extends JerseyTest {
  @BeforeClass
  public static void initLogger() {
    java.util.logging.Logger rootLogger =
      java.util.logging.LogManager.getLogManager().getLogger("");
    java.util.logging.Handler[] handlers = rootLogger.getHandlers();
    for (int i = 0; i < handlers.length; i++) {
      rootLogger.removeHandler(handlers[i]);
    }
    org.slf4j.bridge.SLF4JBridgeHandler.install();
  }
  public FooTest() {
    super("com.XXX");
  }
  @Test
  public void testSomething() throws Exception {
    // ...
  }
}
Run Code Online (Sandbox Code Playgroud)

pom.xml包括这些依赖项:

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.6.1</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.6.1</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>jul-to-slf4j</artifactId>
  <version>1.6.1</version>
</dependency>
<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.16</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

它工作得很好,但我不想在每个单元测试中进行相同的配置.这是一个明显的代码重复,我想避免.我怎样才能更有效地做到这一点?

PS.也许不可能优化上面的代码,我尽我所能?

ass*_*ias 17

如果您使用的是客户端API,则可以手动将日志重定向到slf4j(请注意,它可能会在将来的版本中中断,尽管看起来不太可能):

Logger LOG = LoggerFactory.getLogger(MyClass.class); //slf4j logger

WebTarget ws = ClientBuilder.newClient(config)
                  .register(new LoggingFilter(new JulFacade(), true));

private static class JulFacade extends java.util.logging.Logger {
  JulFacade() { super("Jersey", null); }
  @Override public void info(String msg) { LOG.info(msg); }
}
Run Code Online (Sandbox Code Playgroud)


yeg*_*256 5

最好的方法是通过自定义监听器.在JSF servlet之前初始化它应该在中配置jul-to-slf4j桥contextInitialized(ServletContextEvent).

  • 仅供参考,jul-to-slf4j桥在性能方面可能代价高昂.http://www.slf4j.org/legacy.html#jul-to-slf4j (3认同)