log4j output to different log files

By | April 15, 2016
Share the joy
  •  
  •  
  •  
  •  
  •  
  •  

Normally when we load a logger in Java, we do like below:

private static Logger logger = LoggerFactory.getLogger(App.class);

Or

private Logger logger3 = LoggerFactory.getLogger(getClass());

Logger like this will by default load the root logger.

Alternatively, we can define our own logger. And we can add appender to self-defined logger. In this way, we can output to different log files by using different logger.

Below is an example.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration debug="true">

       <appender name="console" class="org.apache.log4j.ConsoleAppender">
              <layout class="org.apache.log4j.PatternLayout">
                     <param name="ConversionPattern"
                            value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
              </layout>
       </appender>

       <appender name="file" class="org.apache.log4j.RollingFileAppender">
              <param name="append" value="true" />
              <param name="maxFileSize" value="1MB" />
              <param name="maxBackupIndex" value="10" />
              <param name="file" value="test.log" />
              <layout class="org.apache.log4j.PatternLayout">
                     <param name="ConversionPattern"
                            value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
              </layout>
       </appender>

       <appender name="myFile" class="org.apache.log4j.RollingFileAppender">
              <param name="append" value="true" />
              <param name="maxFileSize" value="1MB" />
              <param name="maxBackupIndex" value="10" />
              <param name="file" value="test2.log" />
              <layout class="org.apache.log4j.PatternLayout">
                     <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
              </layout>
       </appender>

       <!--A self defined logger. It is used to output into a separate file. By default, additivity is true.
       If additivity=true, sub logger will append to root logger.
       If additivity=false, sub logger won't append to root logger.
       -->
       <logger name="logger2" additivity="true">
              <level value="INFO" />
              <appender-ref ref="myFile" />
       </logger>

       <root>
              <level value="DEBUG" />
              <appender-ref ref="console" />
              <appender-ref ref="file" />
       </root>

</log4j:configuration>

App.java

public class App {

    private static Logger logger = LoggerFactory.getLogger(App.class);
    private static Logger logger2 = LoggerFactory.getLogger("logger2");

    public static void main(String[] args) {
        logger.info("information");
        logger.warn("warning");
        logger.error("error");
        logger2.info("self-defined logger");
    }
}

Root logger output to test.log with “information”, “warning” and “error”, logger2 output to test2.log with “self-defined logger.
Another thing we should notice is additivity=”true” parameter in logger. If it is set true, all the sub logger will also be output by root logger. If it is set as false, it won’t show in root logger.
Check my code on github: link