Java 如何配置 log4j 以将不同的日志级别记录到同一记录器的不同文件中
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1839647/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to configure log4j to log different log levels to different files for the same logger
提问by vilmonts
I have a normal INFO level log for application. What I need is to additionally log all ERROR level events to separate error log. I am using configuration like this:
我有一个正常的 INFO 级别的应用程序日志。我需要的是另外记录所有错误级别的事件以分隔错误日志。我正在使用这样的配置:
<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>
This configuration logs errors only. If I put info level logger first, then it will log only to general appender, but error logger will not work. I would like to have them both working.
此配置仅记录错误。如果我首先放置信息级别记录器,那么它只会记录到一般的附加程序,但错误记录器将不起作用。我想让他们都工作。
采纳答案by skaffman
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.
您需要做的是具有<logger>
定义级别的 INFO的单个定义,但是在您的两个 appender 定义中,您相应地设置了它们的阈值,例如
<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:
然后将两个 appender 添加到记录器中:
<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.
现在进入记录器的日志条目将被发送到两个 appender,但由于它们具有不同的独立阈值,因此 ERROR_FILE appender 只会记录 ERROR 及以上。
回答by Pawel Solarski
You need to use log4j filters:
您需要使用 log4j 过滤器:
<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.
这样您就可以分别为每个级别创建日志文件。
回答by Tcaci Oleg
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>
回答by robothy
If you are using log4j2 and config with XML format, ThresholdFilteris a good solution.
如果您使用的是 log4j2 和 XML 格式的配置,ThresholdFilter是一个很好的解决方案。
Here is a sample:
这是一个示例:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout>
<Pattern>%d %-5p %m%n</Pattern>
</PatternLayout>
<ThresholdFilter level="DEBUG"/>
</Console>
<RollingFile name="RollingDebugLogFile" fileName="logs/app-debug.log" filePattern="logs/$${date:yyyy-MM}/app-debug-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout>
<Pattern>%d %-5p %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="20MB"/>
</Policies>
<ThresholdFilter level="DEBUG"/>
</RollingFile>
<RollingFile name="RollingErrorLogFile" fileName="logs/app-info.log" filePattern="logs/$${date:yyyy-MM}/app-info-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout>
<Pattern>%d %-5p %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="20MB"/>
</Policies>
<ThresholdFilter level="ERROR"/>
</RollingFile>
<RollingFile name="RollingInfoLogFile" fileName="logs/app-error.log" filePattern="logs/$${date:yyyy-MM}/app-error-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout>
<Pattern>%d %-5p %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="20MB"/>
</Policies>
<ThresholdFilter level="INFO"/>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="testLogger" level="DEBUG" additivity="false">
<AppenderRef ref = "Console" />
<AppenderRef ref="RollingErrorLogFile" />
<AppenderRef ref="RollingInfoLogFile" />
<AppenderRef ref="RollingDebugLogFile" />
</Logger>
<Root level="INFO">
<AppenderRef ref = "Console" />
<AppenderRef ref="RollingErrorLogFile" />
<AppenderRef ref="RollingInfoLogFile" />
<AppenderRef ref="RollingDebugLogFile" />
</Root>
</Loggers>
</Configuration>
回答by borieux
Well, actually, you can do it using .properties file; you don't have to use .xml file :
好吧,实际上,您可以使用 .properties 文件来实现;您不必使用 .xml 文件:
Log only WARN
log4j.appender.appenderName.filter.a=org.apache.log4j.varia.LevelRangeFilter log4j.appender.appenderName.filter.a.LevelMin=WARN log4j.appender.appenderName.filter.a.LevelMax=WARN
Log from INFO to WARN
log4j.appender.appenderName.filter.a=org.apache.log4j.varia.LevelRangeFilter log4j.appender.appenderName.filter.a.LevelMin=INFO log4j.appender.appenderName.filter.a.LevelMax=WARN
仅记录警告
log4j.appender.appenderName.filter.a=org.apache.log4j.varia.LevelRangeFilter log4j.appender.appenderName.filter.a.LevelMin=WARN log4j.appender.appenderName.filter.a.LevelMax=WARN
从 INFO 登录到 WARN
log4j.appender.appenderName.filter.a=org.apache.log4j.varia.LevelRangeFilter log4j.appender.appenderName.filter.a.LevelMin=INFO log4j.appender.appenderName.filter.a.LevelMax=WARN