仅更改记录器中的日志记录滚动更新策略



>我正在使用 2 个记录器(记录器 1 和记录器 2(记录到文件 "file.log"。一个将基于时间的滚动更新策略设置为每天,而另一个设置为每小时。一旦我切换到记录器2,我就不会回到记录器1。但是,切换到 logger2 后滚动更新停止,因为 file.log 具有来自两个记录器的日志。我不想记录到对应于每个记录器的单独文件,然后单独滚动每个文件。

与记录器1关联的滚动文件追加器:

<FileName>file.log</FileName>
<FilePattern>../archive/log-%d{yyyy-MM-dd}.log</FilePattern>

与记录器2关联的滚动文件追加器:

<FileName>file.log</FileName>
<FilePattern>../archive/log-%d{yyyy-MM-dd-HH}.log</FilePattern>

如何在服务器运行时根据切换代码将日志文件的滚动更新策略从每天更改为每小时?(它可以是 1 个记录器/2 个记录器,但翻转应从每天更改为每小时(

我不太确定您想要的输出是什么,但我认为这可能非常接近。请注意,我将提供一个示例,该示例在每毫秒和每秒滚动日志之间切换,但您可以根据需要进行修改。

下面是一个生成一些日志的示例类。它将上下文键设置为"millis",以便 log4j2 将选择一个追加器,该追加器每毫秒滚动一次日志,生成一些日志,等待几秒钟,然后将上下文键设置为"sec"以选择每秒滚动日志的追加器,然后生成更多日志。

package example;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;

public class SomeClass {
private static final Logger log = LogManager.getLogger();
public static void main(String[] args){
ThreadContext.put("rollTime", "millis");
log.debug("This is some debug!");
log.info("Here's some info!");
log.error("Some error happened!");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ThreadContext.put("rollTime", "sec");
log.debug("This is some debug!");
log.info("Here's some info!");
log.error("Some error happened!");
}
}

以下是 log4j2 配置文件(XML 格式(:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
<Routing name="MyRoutingAppender">
<Routes pattern="$${ctx:rollTime}">
<Route key="millis">
<RollingFile name="fileAppender1" fileName="logs/file.log"
filePattern="logs/file.%d{yyyy-MM-dd HH_mm_ss_SSS}.log">
<PatternLayout
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger:%L - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy />
</Policies>
<DefaultRolloverStrategy max="2" />
</RollingFile>
</Route>
<Route key="sec">
<RollingFile name="fileAppender2" fileName="logs/file.log"
filePattern="logs/file.%d{yyyy-MM-dd HH_mm_ss}.log">
<PatternLayout
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger:%L - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy />
</Policies>
<DefaultRolloverStrategy max="2" />
</RollingFile>
</Route>
</Routes>
</Routing>
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="Console" />
<AppenderRef ref="MyRoutingAppender" />
</Root>
</Loggers>
</Configuration>

希望此示例接近您想要实现的目标,并有助于指导您找到解决方案。

最新更新