Logback 是解决此问题的可行解决方案。在查看了不同的 hack 以使其与 log4j 一起工作之后,我们决定切换到 Logback。我在 webapp 中使用了以下配置和 Logback jar。
webapp 内的一个 Logback 文件,其中包含一个外部文件:
<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="10 seconds">
<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
<resetJUL>true</resetJUL>
</contextListener>
<contextName>${project.artifactId}</contextName>
<jmxConfigurator />
<include file="${logback.configuration.filepath}" />
</configuration>
${logback.configuration.filepath}
在 Maven 过滤期间被配置文件的 webapp 外部的确切路径替换(类似于/opt/server/conf/loback.included.conf)。
然后,logback.included.conf
(这个文件是项目的一部分,用 交付build-helper:attach-artifact
,所以${project.artifactId}
在 Maven 过滤期间也被替换)的内容:
<?xml version="1.0" encoding="UTF-8" ?>
<included>
<appender name="file" class="ch.qos.logback.core.FileAppender">
<file>/var/log/server/${project.artifactId}.log</file>
<encoder>
<pattern>[@/%contextName] %date{ISO8601} [%-5level] %thread:[%logger] %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="file" />
</root>
</included>
唯一的限制是,包含文件的内容必须与包含者之一兼容。实际上只是写规则。