将log4j2的配置文件log4j2.xml拆分成多个xml文件

时间:2021-09-16 00:11:34

  在日常的项目开发中,我们可能会使用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拆分已经完成了。