在日常的项目开发中,我们可能会使用log4j2分离系统日志与业务日志 ,这样一来,log4j2.xml 这个配置文件可能就会变得非常臃肿、庞大,那么我们可以将这个文件拆分成多个配置文件吗? 答案是肯定可以的,现在我们就来拆拆看:
假如最初的配置文件是这样的:
<?xml version="1.0" encoding="UTF-8"?> <configuration status="OFF"> <Properties> <property name="log_pattern"> %d %-5p [%c] %m%n</property> <property name="basePath">/logs</property> <property name="common-msg">${basePath}/common.log</property> <property name="rollingfile_common-msg">${basePath}/common%d{yyyy-MM-dd}.log</property> <property name="error-msg">${basePath}/error.log</property> <property name="rollingfile_error-msg">${basePath}/error%d{yyyy-MM-dd}.log</property> </Properties> <!--先定义所有的appender --> <appenders> <!--输出控制台的配置 --> <Console name="Console" target="SYSTEM_OUT"> <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) --> <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" /> <!--输出日志的格式 --> <PatternLayout pattern="${log_pattern}" /> </Console> <RollingFile name="rollingfile_common-msg" filename="${common-msg}" filePattern="${rollingfile_common-msg}" append="true"> <Filters> <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/> <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> <Policies> <TimeBasedTriggeringPolicy /> </Policies> </RollingFile> <RollingFile name="rollingfile_error-msg" filename="${error-msg}" filePattern="${rollingfile_error-msg}" append="true"> <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout> <Pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %class{36} %L %M - %msg%xEx%n</Pattern> </PatternLayout> <Policies> <TimeBasedTriggeringPolicy /> </Policies> </RollingFile> </appenders> <loggers> <AsyncLogger name="common.test.log4j2" level="info" additivity="false" includeLocation="true"> <AppenderRef ref="rollingfile_common-msg" /> <AppenderRef ref="rollingfile_error-msg" /> </AsyncLogger> </loggers> </configuration>
根据上面配置文件结构,假设我们按照 Properties、appenders、loggers 总共拆成三个配置文件(具体怎么拆分可以根据自己的实际需要进行);
首先看看第一个文件,包含Properties配置(直接定义成一个父配置文件吧,log4j2.xml):
<?xml version="1.0" encoding="UTF-8"?> <configuration status="OFF" xmlns:xi="http://www.w3.org/2001/XInclude" name="XIncludeDemo"> <!-- 定义下面的引用名 --> <Properties> <property name="log_pattern"> %d %-5p [%c] %m%n</property> <property name="basePath">/logs</property> <property name="common-msg">${basePath}/multTest.log</property> <property name="rollingfile_common-msg">${basePath}/multTest%d{yyyy-MM-dd}.log</property> <property name="error-msg">${basePath}/multTesterror.log</property> <property name="rollingfile_error-msg">${basePath}/multTesterror%d{yyyy-MM-dd}.log</property> </Properties> </configuration>
再来看看包含appenders的配置文件(log4j2_appender.xml):
<appenders> <!--输出控制台的配置 --> <Console name="Console" target="SYSTEM_OUT"> <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) --> <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" /> <!--输出日志的格式 --> <PatternLayout pattern="${log_pattern}" /> </Console> <RollingFile name="rollingfile_common-msg" filename="${common-msg}" filePattern="${rollingfile_common-msg}" append="true"> <Filters> <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/> <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> </Filters> <Policies> <TimeBasedTriggeringPolicy /> </Policies> </RollingFile> <RollingFile name="rollingfile_error-msg" filename="${error-msg}" filePattern="${rollingfile_error-msg}" append="true"> <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout> <Pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %class{36} %L %M - %msg%xEx%n</Pattern> </PatternLayout> <Policies> <TimeBasedTriggeringPolicy /> </Policies> </RollingFile> </appenders>
接下来该包含loggers的配置文件了(log4j2_logger.xml):
<loggers> <AsyncLogger name="common.test.log4j2" level="info" additivity="false" includeLocation="true"> <AppenderRef ref="rollingfile_common-msg" /> <AppenderRef ref="rollingfile_error-msg" /> </AsyncLogger> </loggers>
原来的log4j2.xml 已经拆分成三个配置文件了,但是三个文件之间还没有关系,是无法使用的,最后,我们在log4j2.xml中加入关系映射:
<?xml version="1.0" encoding="UTF-8"?> <configuration status="OFF" xmlns:xi="http://www.w3.org/2001/XInclude" name="XIncludeDemo"> <!-- 定义下面的引用名 --> <Properties> <property name="log_pattern"> %d %-5p [%c] %m%n</property> <property name="basePath">/logs</property> <property name="common-msg">${basePath}/multTest.log</property> <property name="rollingfile_common-msg">${basePath}/multTest%d{yyyy-MM-dd}.log</property> <property name="error-msg">${basePath}/multTesterror.log</property> <property name="rollingfile_error-msg">${basePath}/multTesterror%d{yyyy-MM-dd}.log</property> </Properties> <xi:include href="log4j2_appender.xml" /> <!--配置关系 --> <xi:include href="log4j2_logger.xml" /> </configuration>
到此为止,log4j2.xml拆分已经完成了。