slf4j,更改记录器或在运行时添加appender

时间:2013-10-07 14:36:49

标签: java-ee log4j slf4j interceptor

我正在使用SLF4J进行日志记录(使用Log4J)。 使用的appender使用xml配置。

<appender name="business" class="org.apache.log4j.RollingFileAppender">
    <param name="maxFileSize" value="10MB" />
    <param name="maxBackupIndex" value="10" />
    <param name="File" value="${jboss.server.log.dir}/business.log" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d %p [%t] %c - %m%n" />
    </layout>
</appender>
<category name="BusinessLogger" additivity="false">
    <level value="INFO" />
    <appender-ref ref="business" />
</category>

在拦截器中调用日志进程。现在,我正在尝试测试日志的输出。我在运行时使用以下命令调用记录器:

private static final Logger BUSINESS_LOGGER = LoggerFactory.getLogger("BusinessLogger");

为了测试日志(使用junit),日志的输出需要作为变量保存在某处。我有一个创建自定义appender的想法,它将最后一个日志保存到变量中,但我似乎无法添加appender或更改appender,因为slf4j中的Logger类是一个接口。有没有人知道这方面的任何解决方法?

4 个答案:

答案 0 :(得分:3)

所以我在alterfox的帮助下解决了这个问题。

当我使用slf4j调用记录器时:

private static final Logger BUSINESS_LOGGER = LoggerFactory.getLogger("BusinessLogger");

它从slf4j返回一个logger适配器的实现,它没有add appender方法。所以我使用log4j Logger类

调用了记录器
private static final Logger BUSINESS_LOGGER = Logger.getLogger("BusinessLogger")

即使类名是“Logger”,它们也来自不同的包。后一个是Log4J方法,它从Log4J返回实际的Logger对象。然后addAppender方法变得可用。好吧,我试过这个,它不起作用(除了它)。问题是,我忘了设置日志级别。所以在添加appender之后,我设置了日志级别,然后我看到通过第二个appender的日志。

答案 1 :(得分:2)

这可能看起来很简单,但我发现当我遇到这个错误时,我忘记将我的POM中的活页夹包放在我的应用程序中。

  <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.7</version>
  </dependency>

答案 2 :(得分:0)

您可以使用控制台appender,并重定向控制台输出。有关详情,请参阅此帖子:Redirect console output to string in java

此外,您可以使用文件追加器,然后在需要检查时从文件中读取日志。

最后,看看这对你有什么帮助:PropertyConfigurator

答案 3 :(得分:0)

slf4j只是log4j / log4j2 / logback顶部的外观。 声明slf4j记录器对象后,

private static final Logger BUSINESS_LOGGER = LoggerFactory.getLogger("BusinessLogger");

您可以使用log4j LogManager添加log4j附加程序。

LogManager.getLogger("BusinessLogger").addAppender(consoleAppender);