如何configurationlog4j将不同的日志级别logging到同一个logging器的不同文件中

我有一个正常的应用程序INFO级别日志。 我需要的是另外logging所有ERROR级别的事件,以单独的错误日志。 我正在使用这样的configuration:

<logger name="com.acme"> <level value="error"/> <appender-ref ref="error"/> </logger> <logger name="com.acme"> <level value="info"/> </logger> <root> <level value="warn"/> <appender-ref ref="general"/> </root> 

此configuration仅logging错误。 如果我先放置信息级别logging器,那么它只会logging到一般的appender,但错误logging器将不起作用。 我想让他们都工作。

你需要做的是有一个具有定义的INFO级别的<logger>定义,但是在你的两个appender定义中,相应地设置它们的阈值,例如

 <appender name="ERROR_FILE"> <param name="Threshold" value="ERROR"/> </appender> <appender name="GENERAL"> <param name="Threshold" value="INFO"/> </appender> 

然后你将两个appender添加到你的logging器:

 <logger name="com.acme"> <level value="INFO"/> <appender-ref ref="ERROR_FILE"/> <appender-ref ref="GENERAL"/> </logger> 

现在进入logging器的日志条目将被发送给两个appender,但由于它们具有不同的独立阈值,所以ERROR_FILE appender将只loggingERROR及以上。

完整的工作解决scheme,包括文件名中的date:

 <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> 

你需要使用log4jfilter:

 <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="levelMin" value="ERROR" /> <param name="levelMax" value="ERROR" /> </filter> 

这样,您可以分别为每个级别创build日志文件。