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

将log4j2的配置文件log4j2.xml拆分成多个xml文件的更多相关文章

  1. C#将XML转换成JSON转换XML

    原文:C#将XML转换成JSON转换XML using System; using System.Collections.Generic; using System.Linq; using Syste ...

  2. WPS 2019 多个sheet表拆分成独立的excel文件

    参考: https://www.cnblogs.com/hackxiyu/p/8945975.html 场景:将多个sheet表拆分成独立的excel文件 一.安装VB工具: 默认情况下:wps -- ...

  3. log4j2的配置文件log4j2.xml笔记

    一.背景 最近由于项目的需要,我们把log4j 1.x的版本全部迁移成log4j 2.x 的版本,那随之而来的slf4j整合log4j的配置(使用Slf4j集成Log4j2构建项目日志系统的完美解决方 ...

  4. excel多个sheet表拆分成独立的excel文件

    一.问题: 公司做一个项目,给的用户上报文是一个包含多个sheet页的excel文件, 但是在实际处理报文数据的时候需要拆分excel文件为多个独立的报文excel文件 二.解决: (1)一个一个的复 ...

  5. 把xml转成javabean的工具类

    import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; import javax.x ...

  6. xml转换成map

    import java.io.IOException;import java.io.StringReader;import java.util.ArrayList;import java.util.H ...

  7. 聊一聊log4j2配置文件log4j2.xml

    一.背景 最近由于项目的需要,我们把log4j 1.x的版本全部迁移成log4j 2.x 的版本,那随之而来的slf4j整合log4j的配置(使用Slf4j集成Log4j2构建项目日志系统的完美解决方 ...

  8. log4j2配置文件log4j2.xml

    原地址:https://www.cnblogs.com/hafiz/p/6170702.html 1.关于配置文件的名称以及在项目中的存放位置 log4j 2.x版本不再支持像1.x中的.proper ...

  9. log4j2配置文件log4j2.xml详解(转载)

    此博文转载自阿豪聊干货:https://www.cnblogs.com/hafiz/p/6170702.html 一.背景 最近由于项目的需要,我们把log4j 1.x的版本全部迁移成log4j 2. ...

随机推荐

  1. 15,Flask-Script

    Flask-Script 从字面意思上来看就是 Flask 的脚本 是的,熟悉Django的同学是否还记得Django的启动命令呢? python manager.py runserver 大概是这样 ...

  2. 多个".h"文件中声明及定义 全局变量和函数

    一.".h"文件必须以如下格式书写 例:文件<CZ_efg_hi.h"> ------------文件内容----------- #ifndef CZ_Efg ...

  3. 对于STM32别名区的理解 (转载)

    1. 什么是位段.位带别名区? 2. 它有什么好处? 答1: 是这样的,记得MCS51吗? MCS51就是有位操作,以一位(BIT)为数据对象的操作,       MCS51可以简单的将P1口的第2位 ...

  4. Installing Nginx With PHP5 (And PHP-FPM) And MySQL Support (LEMP) On Ubuntu 12.04 LTS [repost]

    from : http://www.howtoforge.com/installing-nginx-with-php5-and-php-fpm-and-mysql-support-lemp-on-ub ...

  5. 《Cracking the Coding Interview》——第5章:位操作——题目3

    2014-03-19 05:57 题目:给定一个整数N,求出比N大,而且二进制表示中和N有相同个数的‘1’的最小的数,比如3是‘11’,接下来的5是‘101’,再接下来的6是‘110’. 解法:从低位 ...

  6. python学习笔记三:函数及变量作用域

    一.定义 def functionName([arg1,arg2,...]): code 二.示例 #!/usr/bin/python #coding:utf8 #coding=utf8 #encod ...

  7. 程序员必备PC维修法(软件篇)

    学会使用专业软件检测与修复电脑硬件故障问题也是程序员的一种软技能. windows篇 情景:如何获取电脑硬件的真实信息.(如何检验选购回来的硬件是否正品) 自检:使用AIDA64软件检查电脑硬件,能详 ...

  8. eclipse集成python(Pydev插件安装)

    1.下载PyDev的压缩包,解压后会有features和plugins两个文件夹,将两个文件夹的内容拷贝到eclipse对应的文件夹中,重新启动eclipse 2.配置python 2.1打开ecli ...

  9. Hastable和Dictionary以及ArrayList和(List,LinkedList,数组)的区别

    Hastable和Dictionary的区别:(键值对) 1:单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分. 2:多线程程序中推荐使用 Hashtabl ...

  10. (笔记) RealTimeRender[实时渲染] C2

    @author: 白袍小道 @来源:RealTime Render @建议书籍:龙书.RealTimeR第四版.GPUGem和PRO (来源:暗影不解释) 引点 这一章关注的管线中的管道功能,而非实现 ...