我希望每个日志级别的日志消息转到另一个文件。从名称来看,LevelMatchFilter看起来就像我想要的那样,除了它似乎没有从不同的级别过滤任何东西。
我认为以下属性应该使用LevelRangeFilter来实现。但是,无论级别如何,发送到全局记录器的任何内容都将在INFO.log中结束。
log4j.rootLogger = OFF
# Global level based logs
log4j.logger.global = ALL, Info
log4j.appender.Info=org.apache.log4j.FileAppender
log4j.appender.Info.File=Logs/INFO.log
log4j.appender.Info.layout=org.apache.log4j.PatternLayout
log4j.appender.Info.layout.ConversionPattern=%d [%p] %m%n
log4j.appender.Info.filter.a=org.apache.log4j.filter.LevelRangeFilter
log4j.appender.Info.filter.a.LevelMin=info
log4j.appender.Info.filter.a.LevelMax=info
log4j.appender.Info.filter.a.AcceptOnMatch=true
我还尝试将INFO
用于LevelMin
和LevelMax
的值,但结果相同。
我做错了什么?
作为一个附带问题,有没有办法在使用属性文件时打开log4cxx配置的调试?我在使用xml文件时找到了一个选项,但没有明显的属性翻译(debug=true
,log4j.debug=true
)和任何效果。
答案 0 :(得分:0)
从log4cxx 0.10开始(可能更早),属性格式不支持过滤器。因此,需要XML配置(或编程配置)。
<?xml version="1.0" encoding="UTF-8" ?>
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true">
<appender name="Info" class="org.apache.log4j.FileAppender">
<param name="file" value="Logs/INFO.log" />
<param name="append" value="false" />
<!-- If this filter accepts the message, it will be printed. That happens if this is an info message -->
<filter class="org.apache.log4j.filter.LevelMatchFilter">
<param name="levelToMatch" value="INFO" />
<param name="acceptOnMatch" value="true" />
</filter>
<!-- If it is not an info message, this filter will reject it -->
<filter class="org.apache.log4j.filter.DenyAllFilter"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d [%p] %m%n" />
</layout>
</appender>
<root>
<priority value="off" />
</root>
<logger name="global">
<priority value="all" />
<appender-ref ref="Info" />
</logger>
</log4j:configuration>