简体   繁体   中英

log4j vs log4j2: log to different file

Using log4j I can log to different files invoking this method:

Logger.getLogger("test")

where test is an appender defined in log4j.properties. How can I log to different files with log4j2? This is my configuration file and I would choose programmatically where to log:

<Properties>
    <Property name="log-path">C:/logs</Property>
</Properties>

<Loggers>
    <Logger name="it.mypackage" level="debug" additivity="false">
        <appender-ref ref="file" level="debug" />
        <appender-ref ref="file2" level="error" />
    </Logger>
</Loggers>

<Appenders>

    <!-- file.log -->
    <RollingFile name="file" fileName="${log-path}/file.log" filePattern="${log-path}/file-%d{yyyy-MM-dd}.log">
        <PatternLayout>
            <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n</pattern>
        </PatternLayout>
        <Policies>
            <TimeBasedTriggeringPolicy interval="1" modulate="true" />
        </Policies>
    </RollingFile>

    <!-- file2.log -->
    <RollingFile name="file2" fileName="${log-path}/file2.log" filePattern="${log-path}/file2-%d{yyyy-MM-dd}.log">
        <PatternLayout>
            <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n</pattern>
        </PatternLayout>
        <Policies>
            <TimeBasedTriggeringPolicy interval="1" modulate="true" />
        </Policies>
    </RollingFile>
</Appenders>

[SOLUTION] Oh Yes, I'm missing a logger:

<Properties>
    <Property name="log-path">C:/logs</Property>
</Properties>

<Loggers>
    <Logger name="logger1" level="debug" additivity="false">
        <appender-ref ref="file" level="debug" />
    </Logger>
    <Logger name="logger2" level="debug" additivity="false">
        <appender-ref ref="file" level="debug" />
        <appender-ref ref="file2" level="error" />
    </Logger>
</Loggers>

<Appenders>

    <!-- file.log -->
    <RollingFile name="file" fileName="${log-path}/file.log" filePattern="${log-path}/file-%d{yyyy-MM-dd}.log">
        <PatternLayout>
            <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n</pattern>
        </PatternLayout>
        <Policies>
            <TimeBasedTriggeringPolicy interval="1" modulate="true" />
        </Policies>
    </RollingFile>

    <!-- file2.log -->
    <RollingFile name="file2" fileName="${log-path}/file2.log" filePattern="${log-path}/file2-%d{yyyy-MM-dd}.log">
        <PatternLayout>
            <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n</pattern>
        </PatternLayout>
        <Policies>
            <TimeBasedTriggeringPolicy interval="1" modulate="true" />
        </Policies>
    </RollingFile>
</Appenders>

I can choose logger in this way:

private static Logger logger = LogManager.getLogger("logger1");

If you keep the rest of the configuration the same, but modify the Loggers section:

<Loggers>
  <Logger name="logger1" level="debug" additivity="false">
    <appender-ref ref="file" level="debug" />
  </Logger>
  <Logger name="logger2" level="debug" additivity="false">
    <appender-ref ref="file2" level="error" />
  </Logger>
</Loggers>

Now, you can select the appender in your code by getting the logger by name:

Logger logger1 = LogManager.getLogger("logger1");

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM