我有一个java类(设备控制器),用于创建5个独立的进程。为每个进程分配一个标识符。我希望每个进程根据其分配的标识符写入自己的日志文件。我在共享的log4j2.xml配置文件中定义了所有的appender和logger。
问题:当我启动第一个设备控制器时,它成功写入正确的日志文件。但是,当我启动第二个设备控制器时,log4j将翻转log4j2.xml配置文件中的所有记录器,并且只会写入分配给新进程的日志文件。第一个进程的所有日志消息都将转到转存日志文件,但新消息不再写入其新转换的日志文件。
(操作系统:Linux,log4j版本:2.8.2)
下面是我使用的log4j2.xml配置文件的缩写版本。
...
<Appenders>
...
<RollingFile name="RollingFile-1" fileName="/logs/EPDU/Device-1.log" filePattern="/logs/EPDU/Device-1_%d{dd-MMM-yyyy::HH:mm:ss}.log">
<PatternLayout>
...
</PatternLayout>
<Policy>
<OnStartUpTriggeringPolicy minSize="1"/>
<SizeBasedTriggeringPolicy size="20 MB"/>
</Policy>
<DefaultRolloverStrategy fileIndex="nomax"/>
</RollingFile>
...
<RollingFile name="RollingFile-5" fileName="/logs/EPDU/Device-5.log" filePattern="/logs/EPDU/Device-5_%d{dd-MMM-yyyy::HH:mm:ss}.log">
<PatternLayout>
...
</PatternLayout>
<Policy>
<OnStartUpTriggeringPolicy minSize="1"/>
<SizeBasedTriggeringPolicy size="20 MB"/>
</Policy>
<DefaultRolloverStrategy fileIndex="nomax"/>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="device-1" level="trace" additivity="false">
<AppenderRef ref="RollingFile-1" level="debug"/>
</Logger>
...
<Logger name="device-5" level="trace" additivity="false">
<AppenderRef ref="RollingFile-5" level="debug"/>
</Logger>
</Loggers>
在确定设备标识符之后,在主方法中初始化并分配Logger变量,类似于以下代码:
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
public class DeviceController {
private satic Logger deviceLogger;
public DeviceController(Param param1, Param param2){
...
}
...
public static void main(String[] args) {
/**
* Fancy code to find device identifier...
* String loggerName = (results of fancy code is "device-[1..5]");
*/
deviceLogger = LogManager.getLogger(loggerName);
deviceLogger.info("Start logging stuff in device log.");
new DeviceController(param1, param2);
}
...
}
如何阻止所有记录器翻转,而是将当前正在运行的进程/日志保留为下一个进程并启动日志?
注意:我试图提供一个&#34; Goldilocks&#34;解释问题的详细程度。对不起,如果我提供的信息太多或信息不足。
答案 0 :(得分:0)
你能展示一下你的代码吗?我认为您的问题来自于您拥有静态记录器的事实。因此,从上面的代码片段中,我相信你会为每个新的DeviceController覆盖一个带有下一个标识符的新Logger的deviceLogger。我猜想最后,你的所有日志都被附加到你的设备-5日志文件中,不是吗?
旁注,我认为使用sl4f接口声明记录器然后将log4j实现分配给记录器是一种很好的做法。