Log4j2 Multiple Appenders Example

Given log4j2.xml is reference to configure multiple appenders such as console appender and file appenders. This also configure the dynamic log root path. Log4j2 Multiple Appenders – XML Configuration Sample log4j2 configuration is given blow. It does following things: Uses dynamic log root path where log files will …

Log4j2

Given log4j2.xml is reference to configure multiple appenders such as console appender and file appenders. This also configure the dynamic log root path.

Log4j2 Multiple Appenders – XML Configuration

Sample log4j2 configuration is given blow. It does following things:

  1. Uses dynamic log root path where log files will be created. Pass environment variable as -DAPP_LOG_ROOT=c:/temp to configure it.
  2. Demo the usage of property constants defined in config file e.g. LOG_PATTERN in below file.
  3. It uses LevelRangeFilter to log different log level statements in different files i.e. debug logs in one file and error logs in separate file.
  4. All logs will be shown in console also.
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">

    <Properties>
        <Property name="LOG_PATTERN">%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ} %p %m%n</Property>
    </Properties>

    <Appenders>

        <Console name="Console" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </Console>
        
		<RollingFile name="debugLog" fileName="${sys:APP_LOG_ROOT}/application-debug.log" 
			filePattern="${sys:APP_LOG_ROOT}/application-debug-%d{yyyy-MM-dd}-%i.log">
			<LevelRangeFilter minLevel="DEBUG" maxLevel="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
			<PatternLayout pattern="${LOG_PATTERN}"/>
			<Policies>
				<SizeBasedTriggeringPolicy size="19500KB" />
			</Policies>
			<DefaultRolloverStrategy max="10"/>
		</RollingFile>
		
		<RollingFile name="infoLog" fileName="${sys:APP_LOG_ROOT}/application-info.log" 
			filePattern="${sys:APP_LOG_ROOT}/application-info-%d{yyyy-MM-dd}-%i.log" >
			<LevelRangeFilter minLevel="INFO" maxLevel="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
			<PatternLayout pattern="${LOG_PATTERN}"/>
			<Policies>
				<SizeBasedTriggeringPolicy size="19500KB" />
			</Policies>
			<DefaultRolloverStrategy max="10"/>
		</RollingFile>
		
		<RollingFile name="errorLog" fileName="${sys:APP_LOG_ROOT}/application-error.log" 
			filePattern="${sys:APP_LOG_ROOT}/application-error-%d{yyyy-MM-dd}-%i.log" >
			<LevelRangeFilter minLevel="ERROR" maxLevel="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
			<PatternLayout pattern="${LOG_PATTERN}"/>
			<Policies>
				<SizeBasedTriggeringPolicy size="19500KB" />
			</Policies>
			<DefaultRolloverStrategy max="10"/>
		</RollingFile>
		
		<RollingFile name="springLog" fileName="${sys:APP_LOG_ROOT}/spring.log" 
			filePattern="${sys:APP_LOG_ROOT}/spring-%d{yyyy-MM-dd}-%i.log" >
			<PatternLayout pattern="${LOG_PATTERN}"/>
			<Policies>
				<SizeBasedTriggeringPolicy size="19500KB" />
			</Policies>
			<DefaultRolloverStrategy max="1"/>
		</RollingFile>
		
		<RollingFile name="aopLog" fileName="${sys:APP_LOG_ROOT}/application-aop.log" 
			filePattern="${sys:APP_LOG_ROOT}/application-aop-%d{yyyy-MM-dd}-%i.log" >
			<PatternLayout pattern="${LOG_PATTERN}"/>
			<Policies>
				<SizeBasedTriggeringPolicy size="19500KB" />
			</Policies>
			<DefaultRolloverStrategy max="1"/>
		</RollingFile>
		
    </Appenders>

    <Loggers>
    
    	<Logger name="com.howtodoinjava.app.aop" additivity="false">
    		<AppenderRef ref="aopLog" />
            <AppenderRef ref="Console" />
        </Logger>
        
        <Logger name="com.howtodoinjava.app" additivity="false">
	        <AppenderRef ref="debugLog" />
	        <AppenderRef ref="infoLog"  />
            <AppenderRef ref="errorLog" />
            <AppenderRef ref="Console"  />
        </Logger>
        
        <Logger name="org.springframework" additivity="false">
            <AppenderRef ref="springLog" />
            <AppenderRef ref="Console"/>
        </Logger>
                
        <Root level="all">
            <AppenderRef ref="Console"/>
        </Root>

    </Loggers>

</Configuration>

Drop me your questions in the comments section.

Happy Learning !!

Leave a Comment

  1. In a web application, can we write to 2 separate logfiles, using 2 separate config files or 2 appenders.
    We are doing this using log4j-1.2.15 (using 2 config files). Any thoughts on how to achieve this.

    Reply
    • I do not understand the need for 2 configuration files. Indeed, we can use separate appenders to log into multiple files as shown in this post.

      Please elaborate the issue in detail if you require additional help.

      Reply
  2. Many thanks, but one question remains for me. How can you define multiple loggers with log4j2.properties configuration

    Reply
  3. Is there a way in Log4j2 to allow logging specific content to a separate file (audit log)?

    For example, if value x changes, log to file1 that value of x has changed. This file1 is intended to capture audit logs if value of x changes. If this is supported, I would like to scale this to actual business logic for an audit log.

    Reply
      • There are two possible approaches.

        1. Create a sperate logger/appender in config file specific to the java package where audit lode is present.




        2. Create a custom Log level and log all audit messages to that level.

        //One time create the level
        final Level AUDIT = Level.forName("AUDIT", 550);

        //how to log
        logger.log(Level.forName("AUDIT"), "a diagnostic message");

        Consider creating a utility class with method auditLog(String message) for call it from everywhere in the application.

        Reply
  4. Hi, I am using log4j2 with xml config.

    I want to write logs depending upon the class name, i.e. for each testng class a separate log file.

    While running multiple classes from testng, it just writes into the first class name.
    I have written a static method which returns me the logger in utils class.

        public static Logger getDynamicLogger(Class className) {
            SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
            Date date = new Date();
            System.setProperty("logFilename", className.getSimpleName() + "-" + formatter.format(date));
       
            SimpleDateFormat pkgFormatter = new SimpleDateFormat("dd-MMMM-yy");
            System.setProperty("logFileFolder",pkgFormatter.format(date));
          
            ThreadContext.put("className",className.getName());
            Reporter.log(className.getName(),true);
            return LogManager.getLogger(className);
        }
    

    Any idea for this

    Reply
  5. Hello,

    I am looking for some insight or help regarding the log4j2 configuration or code to write the custom logs to a remote redhat linux and a windows machine. Could you please provide me some help?

    I have seen some log4j links, forums suggesting to use the log4j at sender side and also receiver side. But my application uses log4j2, so could you please care to help?

    Regards

    Kaushik

    Reply

Leave a Comment

About Us

HowToDoInJava provides tutorials and how-to guides on Java and related technologies.

It also shares the best practices, algorithms & solutions and frequently asked interview questions.