在生产环境的日志配置中新加了一个日志文件输出配置,如下注释处:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration> <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{MM-dd HH:mm:ss,SSS/} %-5p] [%t] %c{2/}:%L - %m%n"/> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="levelMin" value="error"/> <param name="levelMax" value="off"/> <param name="AcceptOnMatch" value="true"/> </filter> </appender> <appender name="DAILY_ROLLING_FILE" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="../log/main.log"/> <param name="DatePattern" value="'.'yyyy-MM-dd'.log'"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{MM-dd HH:mm:ss SSS/} %-5p] [%t] %c{3/}:%L - %m%n"/> </layout> <filter class="org.apache.log4j.varia.LevelMatchFilter"> <param name="LevelToMatch" value="ERROR"/> <param name="AcceptOnMatch" value="true"/> </filter> </appender> <!-- 新增配置开始 --> <appender name="ANALYSIS_DAILY_ROLLING_FILE" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="../log/analysis.log"/> <param name="DatePattern" value="'.'yyyy-MM-dd'.log'"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%m%n"/> </layout> <filter class="org.apache.log4j.varia.LevelMatchFilter"> <param name="LevelToMatch" value="INFO"/> <param name="AcceptOnMatch" value="true"/> </filter> </appender> <appender name="ASYNC_ANALYSIS_DAILY_ROLLING_FILE" class="org.apache.log4j.AsyncAppender"> <appender-ref ref="ANALYSIS_DAILY_ROLLING_FILE"/> </appender> <logger name="LOGGER_ANALYSIS"> <level value="INFO"/> <appender-ref ref="ASYNC_ANALYSIS_DAILY_ROLLING_FILE"/> </logger> <!-- 新增配置结束 --> <root> <level value="ERROR"/> <appender-ref ref="DAILY_ROLLING_FILE"/> </root> </log4j:configuration>
这个新增的配置会在原有的日志文件 main.log 外,新增一个全新的日志文件 analysis.log 记录一些信息。结果上线后,不仅日志输出到了 analysis.log,同时也输出到了 main.log 中了一份,冗余了。Google 了一下,原来是 root
和 additivity
的问题。
原来,在如下的两个 logger
中,存在着继承关系, LOGGER_ANALYSIS
是继承了 root
的
<logger name="LOGGER_ANALYSIS"> <level value="INFO"/> <appender-ref ref="ASYNC_ANALYSIS_DAILY_ROLLING_FILE"/> </logger> <root> <level value="ERROR"/> <appender-ref ref="DAILY_ROLLING_FILE"/> </root>
继承,就意味着 LOGGER_ANALYSIS
是继承了 root
的 appender-ref
的,因此, LOGGER_ANALYSIS
不知输出到了自己的 appender
设置的文件 analysis.log 里,也会输出到 DAILY_ROLLING_FILE
对应的 main.log 里,也就是冗余了。
那么,怎么解决呢?很简单,让儿子不继承爸爸就好了,不做富二代,白手起家,自己打天下。
<logger name="LOGGER_ANALYSIS" additivity="false"> <level value="INFO"/> <appender-ref ref="ASYNC_ANALYSIS_DAILY_ROLLING_FILE"/> </logger>
注意上边的 additivity="false"
就这个设置,就声明和 root
脱离父子关系了,独立了。问题解决。