阻止log4j在启动时滚动配置文件中的所有记录器

时间:2017-08-04 16:47:56

标签: java logging log4j2

我有一个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;解释问题的详细程度。对不起,如果我提供的信息太多或信息不足。

1 个答案:

答案 0 :(得分:0)

你能展示一下你的代码吗?我认为您的问题来自于您拥有静态记录器的事实。因此,从上面的代码片段中,我相信你会为每个新的DeviceController覆盖一个带有下一个标识符的新Logger的deviceLogger。我猜想最后,你的所有日志都被附加到你的设备-5日志文件中,不是吗?

旁注,我认为使用sl4f接口声明记录器然后将log4j实现分配给记录器是一种很好的做法。