6

我正在使用 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),日志的输出需要作为变量保存在某处。我有一个关于创建自定义附加程序的想法,它将最后一个日志保存到变量中,但我似乎无法添加附加程序或更改附加程序,因为 slf4j 中的 Logger 类是一个接口。有没有人可能知道任何解决方法?

4

4 回答 4

3

slf4j 只是 log4j/log4j2/logback 之上的一个门面。一旦你声明了 slf4j 记录器对象:

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

您可以使用 log4j LogManager 添加 log4j appender。

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

于 2019-03-14T04:07:48.760 回答
2

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

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

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

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

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

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

于 2013-10-08T17:24:04.953 回答
2

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

  <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.7</version>
  </dependency>
于 2014-04-24T17:47:41.313 回答
0

您可以使用控制台附加程序,并重定向您的控制台输出。有关详细信息,请参阅此帖子:将控制台输出重定向到 java 中的字符串

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

最后,看看这是否对您有帮助:PropertyConfigurator

于 2013-10-07T14:52:16.443 回答