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

Row*_*nto 5 log4j slf4j java-ee 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>
Run Code Online (Sandbox Code Playgroud)

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

private static final Logger BUSINESS_LOGGER = LoggerFactory.getLogger("BusinessLogger");
Run Code Online (Sandbox Code Playgroud)

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

Row*_*nto 2

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

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

private static final Logger BUSINESS_LOGGER = LoggerFactory.getLogger("BusinessLogger");
Run Code Online (Sandbox Code Playgroud)

它返回我 slf4j 的记录器适配器的实现,它没有添加附加程序方法。所以我使用 log4j Logger 类调用记录器

private static final Logger BUSINESS_LOGGER = Logger.getLogger("BusinessLogger")
Run Code Online (Sandbox Code Playgroud)

尽管类名称是“Logger”,但它们来自不同的包。后一种方法是 Log4J 方法,它从 Log4J 返回实际的 Logger 对象。然后 addAppender 方法就可用了。好吧,我尝试了这个,但它不起作用(除非它起作用)。问题是,我忘记设置日志级别。因此,在添加附加程序后,我设置了日志级别,然后我看到来自第二个附加程序的日志。

  • 如果您的代码直接使用 slf4j (LoggerFactory.getLogger()),这将会失败,因为您将处理程序添加到 log4j,如果直接调用 slf4j,则该处理程序将不会被使用。 (2认同)