How to configure log4j to log different log levels to different files for the same logger
What you need to do is have a single <logger>
definition with a defined level of INFO, but in your two appender definitions, you set their thresholds accordingly, e.g.
<appender name="ERROR_FILE">
<param name="Threshold" value="ERROR"/>
</appender>
<appender name="GENERAL">
<param name="Threshold" value="INFO"/>
</appender>
You then add both appenders to your logger:
<logger name="com.acme">
<level value="INFO"/>
<appender-ref ref="ERROR_FILE"/>
<appender-ref ref="GENERAL"/>
</logger>
Log entries now going to the logger will get sent to both appenders, but since they have different independent thresholds, the ERROR_FILE appender will only log ERROR and above.
Full working solution including the date in the filename:
<appender name="InfoFileAppender" class="org.apache.log4j.rolling.RollingFileAppender">
<rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
<param name="FileNamePattern" value="/var/output/Info_%d{ddMMyyyy}.log" />
</rollingPolicy>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{HH:mm:ss} %-5p %t %c{2} - %m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="INFO" />
<param name="levelMax" value="INFO" />
</filter>
</appender>
<appender name="ErrorFileAppender" class="org.apache.log4j.rolling.RollingFileAppender">
<param name="Threshold" value="ERROR" />
<rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
<param name="FileNamePattern" value="/var/output/Error_%d{ddMMyyyy}.log" />
</rollingPolicy>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{HH:mm:ss} %-5p %t %c{2} - %m%n" />
</layout>
</appender>
<root>
<level value="INFO" />
<appender-ref ref="InfoFileAppender" />
<appender-ref ref="ErrorFileAppender" />
</root>
You need to use log4j filters:
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="ERROR" />
<param name="levelMax" value="ERROR" />
</filter>
That way you can create log files for each level separately.