Log4j2详解——XML配置⽰例(带详细注释)
下⾯是 Log4j 2 的 XML 配置详细⽰例,包含按⽇志级别输出⽇志,按年⽉⽇⽬录⾃动归档⽇志⽂件,⽇志⽂件过多时按⽂件总⼤⼩上线和保存天数上限⾃动删除的功能,⾜够⽇常使⽤。
<?xml version="1.0" encoding="UTF-8"?>
<!--⽇志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后⾯的status,这个⽤于设置log4j2⾃⾝内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够⾃动检测修改配置⽂件和重新配置本⾝,可设置⼀个⾮零的间隔秒数来检测配置变更 -->
<Configuration status="WARN" monitorInterval="60">
<!-- ⾃定义⼀些变量 -->
<Properties>
<!-- 变量定义 -->
<Property name="log_base_dir">/app_data/logs/my_app</Property>
<!-- Appender在将⽇志数据写⼊⽬标位置之前,⼀般会将⽇志数据通过Layout进⾏格式化。PatternLayout可以使⽤与C语⾔printf函数类似的转换模式来指定输出格式。常见的配置如下:
- %d{yyyy-MM-dd HH:mm:ss.SSS} : ⽇志⽣成时间,输出格式为“年-⽉-⽇时:分:秒.毫秒”
- %p : ⽇志输出格式
- %c : logger的名称
- %m : ⽇志内容,即 logger.info("message")
- %n : 换⾏符
- %T : 线程号
- %L : ⽇志输出所在⾏数
- %M : ⽇志输出所在⽅法名 -->
<Property name="log_pattern">[%d{yyyy-MM-dd HH:mm:ss.SSS}][%-5p][%T][%c.%M:%L] %msg%xEx%n</Property>
<!-- 单个⽇志⽂件最⼤⼤⼩,单位可以是KB, MB or GB -->
<Property name="max_single_file_size">1MB</Property>
</Properties>
<!-- 使⽤Appenders元素可以将⽇志事件数据写到各种⽬标位置(⽬前可以为控制台、⽂件、多种数据库API、远程套接字服务器、Apache Flume、
JMS、远程UNIX Syslog daemon),其内的每个Appender都必须要有⼀个name属性作为唯⼀标识,该标识的值在Logger中通过AppenderRef来引
⽤,从⽽将该Appender配置到该Logger中 -->
<Appenders>
<!-- Console Appender常⽤于将⽇志输出到System.out,⼀般⽤在开发环境 -->
<Console name="Console" target="SYSTEM_OUT">
<!-- 只接受程序中DEBUG级别的⽇志进⾏处理-->
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
<!-- 在⼤多数情况下,Appender将格式化LogEvent的责任委托给Layout -->
<PatternLayout pattern="${log_pattern}"/>
</Console>
<!-- RollingFile Appender会将⽇志输出到fileName属性指定的⽂件中,且需要指定TriggeringPolicy和RolloverStrategy。其中
TriggeringPolicy决定是否⽣成新的⽇志⽂件,RolloverStrategy决定如何⽣成新的⽇志⽂件。如果没有配置RolloverStrategy,则会使⽤DefaultRolloverStrategy。从2.5开始,可以在DefaultRolloverStrategy中配置⼀个⾃定义的删除动作。从2.8开始,如果没有指定
⽂件名,则会使⽤DirectWriteRolloverStrategy来代替DefaultRolloverStrategy -->
<!-- 这个RollingFile Appender会打印出所有的DEBUG及以下级别(DEBUG、INFO、ERROR、FATAL、OFF)的信息 -->
<RollingFile name="DebugLogRollingFile" fileName="${log_base_dir}/my_app_debug.log"
filePattern="${log_base_dir}/$${date:yyyy_MM_dd}/my_app_debug_%d{yyyy_MM_dd_HH}_%">
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${log_pattern}" charset="UTF-8"/>
<!-- Policies表⽰⼀个CompositeTriggeringPolicy,可以组合多个TriggeringPolicy,只要内部的任意⼀个TriggeringPolicy
满⾜触发条件,都会滚动⽇志 -->
<Policies>modulate
<!-- TimeBasedTriggeringPolicy⽤于按时间滚动⽇志。只要filePattern属性值中的⽇期/时间模式(pattern)不再应⽤于当
前⽂件时就进⾏⽇志滚动。这种规则通过interval和modulate属性来配置。interval属性指定⼀个整数,⽤于基于⽇期/时间模式中
的最⼩的时间单位数滚动⼀次。例如,filePattern值为/app_data/logs/my_app/$${date:yyyy_MM_dd}/my_app_%d{yyyy_
MM_dd_HH}_%i.log,这⾥使⽤⼩时作为最⼩的时间单位时,假如interval参数值为4,则表⽰每4⼩时滚动⼀次。默认值为1。
modulate表⽰是否调整interval属性值以便下次滚动发⽣在interval边界处。如果时间最⼩单位为⼩时,当前时间为早上3点,间隔为4⼩时,则第⼀次滚动将发⽣在早上4点时(⽽不是早上7点),后续滚动将发⽣在早上8点、中午12点、下午4点等时刻 -->
<TimeBasedTriggeringPolicy interval="1" modulate="false"/>
<!-- SizeBasedTriggeringPolicy⽤于按⽂件⼤⼩滚动⽇志。每当⽇志⽂件超过size指定的⼤⼩(⼀般不超过⼏⼗MB,否则使⽤软件打开导出的⽇志时很不⽅便),则这size⼤⼩的⽇志会⾃动存⼊按filePattern属性指定建⽴的⽂件夹下⾯并进⾏压缩存档 -->
<SizeBasedTriggeringPolicy size="${max_single_file_size}"/>
</Policies>
<!-- DefaultRolloverStrategy可以同时接受RollingFileAppender中filePattern属性值中⽇期/时间和整数计数器(%i)的
pattern,当⽇期/时间满⾜条件时,则会使⽤当前的⽇期/时间⽣成新的⽇志⽂件,如果filePattern属性值中含有⼀个整数计数器%i,则在每次滚动时该整数都会增加,如果filePattern属性值中同时包含了⽇期/时间和整数计数器(%i),计数器会在⽇期/时间不变时⽽满⾜
其他滚动触发条件时(⽂件⼤⼩)开始⾃增,直到⽇期/时间发⽣变化时,计数器会重新⾃增。以.gz、.zip、.bz2、deflate、pack200
或xz结尾的filePattern值,会在⽇志⽂件归档时以后缀对应的格式进⾏压缩。min属性指定计数器的最⼩值,默认为1。max属性指定计数
器的最⼤值,⼀旦计数器达到了最⼤值,最早的归档将会在每次滚动时被删除,默认值为7。fileIndex属性如果设置为max(默认),则具
有更⼤索引的⽂件⽐具有更⼩索引的⽂件内容更新,如果设置为min,⽂件将重命名且计数器将遵循Fixed Window策略,这两种情况均有可
有更⼤索引的⽂件⽐具有更⼩索引的⽂件内容更新,如果设置为min,⽂件将重命名且计数器将遵循Fixed Window策略,这两种情况均有可能导致批量的⽂件重命名,⾃2.8版本开始,如果fileIndex属性设置为nomax,则min和max属性值都将会被忽略,⽂件编号将每次递增1,每次滚动都会递增到更⼤的值,且没有最⼤⽂件编号的限制 -->
<!--<DefaultRolloverStrategy max="100" min="1" fileIndex = "nomax"/>-->
<DefaultRolloverStrategy fileIndex="nomax">
<!-- Log4j 2.5引⼊了删除动作(Delete元素)。在滚动删除旧的⽇志⽂件时,相⽐使⽤DefaultRolloverStrategy的max属性,该功能可以让⽤户拥有更多的删除控制。删除动作可以让⽤户配置若⼲个条件来删除相对于基准⽬录的⽂件。该功能可以删除⾮⽇志⽂件,使⽤时⼀定要⼩⼼。可以通过testMode属性来测试配置是否会错删⽂件。basePath属性值⽤于指定删除⽂件的基准⽬录,必须显式指定。maxDepth属性指定扫描⽬录的最⼤层级,0表⽰仅能访问基准⽬录(安全限制不能访问的情况除外),
Integer.MAX_VALUE值表⽰可以访问所有层级。默认值为1,表⽰仅扫描基准⽬录下的⽂件。testMode属性值如果设置为true,⽂件不会实际删除,⽽是在status logger打印⼀条INFO级别的消息,可以使⽤该功能来测试是否会错删⽬标⽂件,默认为false。-->
<!-- 这⾥的Delete元素配置了每次滚动都会删除基准⽬录下匹配“*/my_app_debug_*.”⽇志⽂件,只要9分钟以前的⽇志⽂件总⼤⼩超过2MB,或9分钟以前的⽇志⽂件⽂件总数超过2个就按时间顺序删除较早的⽇志⽂件。该元素可以防⽌⽇志⽂件所在分区的磁盘空间被占满。特别需要注意的是,只有在发⽣⽇志滚动时才会尝试进⾏删除,否则即使满⾜了删除条件,但如果没有新的滚动⽇志⽣成的话也不会发⽣删除操作。 -->
<Delete basePath="${log_base_dir}" maxDepth="2">
<!-- Delete元素⾥可以指定若⼲个PathCondition类型的元素。如果指定了不⽌⼀个条件,则这些条件都需要在删除之前接受某个路径。这些条件可以嵌套,只有外部条件接受某个路径之后,其内部条件才会决定是否接受该路径。如果这些条件没有嵌套,
则它们的执⾏顺序是任意的。这些条件也可以通过使⽤IfAll, IfAny和IfNot等组合条件进⾏AND、OR和NOT等逻辑运算。⽤户
也可以创建⾃定义条件或使⽤内置条件:
- IfFileName:接受匹配正则表达式或glob的⽂件路径;
- IfLastModified:接受⽐指定时段早或⼀样早的⽂件;
- IfAccumulatedFileCount:在遍历⽂件树时⽂件总数超过⽂件数上限后接受路径;
- IfAccumulatedFileSize:在遍历⽂件树时⽂件总⼤⼩超过上限后接受路径;
- IfAll:如果所有内嵌条件都接受了某个路径才会接受该路径,相当于AND逻辑,其内嵌条件的执⾏顺序是任意的;
- IfAny:如果任意⼀个内嵌条件接受了某个⽬录就接受该⽬录,相当于OR逻辑,其内嵌条件的执⾏顺序是任意的;
- IfNot:如果内嵌条件不接受某个路径就接收该路径,相当于NOT逻辑。-->
<!-- IfFileName可以通过glob(使⽤受限的模式语⾔,⽐正则更简单)或regex属性(正则)来匹配相对路径(相对于Delete 的basePath属性指定的基准⽬录)-->
<!-- 当外部的条件满⾜时才会计算内部的条件,内部的同级条件的计算顺序是任意的。 -->
<IfFileName glob="*/my_app_debug_*.">
<!-- IfLastModified可以通过age属性值来指定接受最后修改时间为指定时间或早于指定时间的路径,该属性的值可参考
org.apache.lling.action.Duration.parse(CharSequence text)⽅法的⽂档 -->
<!-- 这⾥的IfLastModified指定删除达到或超过60天内的⽂件 -->
<IfLastModified age="9m">
<!-- 这⾥的IfAny内嵌了两个PathCondition,表⽰满⾜任意⼀个条件即可 -->
<IfAny>
<!-- IfAccumulatedFileSize可通过exceeds属性值指定⼀个⽂件总⼤⼩上限值。如果⽂件数超过了该上限值
则删除⽂件 -->
<IfAccumulatedFileSize exceeds="2MB"/>
<!-- IfAccumulatedFileCount可通过exceeds属性值指定⼀个⽂件总数上限值。如果⽂件数超过了该上限值
则删除⽂件 -->
<IfAccumulatedFileCount exceeds="2"/>
</IfAny>
</IfLastModified>
</IfFileName>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="InfoLogRollingFile" fileName="${log_base_dir}/my_app_info.log"
filePattern="${log_base_dir}/$${date:yyyy_MM_dd}/my_app_info_%d{yyyy_MM_dd_HH}_%">
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${log_pattern}"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="${max_single_file_size}"/>
</Policies>
<DefaultRolloverStrategy fileIndex="nomax">
<Delete basePath="${log_base_dir}" maxDepth="2">
<IfFileName glob="*/my_app_info_*.">
<!-- 这⾥表⽰匹配“*/my_app_info_*.”模式的⽇志⽂件的删除策略如下:
- 只要⽇志⽂件总数量超过5个就删除按时间顺序最早的⽇志⽂件
- 只要⽇志⽂件总⼤⼩超过10MB就会删除按时间顺序最早的⽇志⽂件
-
只要⽇志⽂件最近修改时间为9分钟前或更早就会删除按时间顺序最早的⽇志⽂件 -->
<IfAny>
<IfAccumulatedFileSize exceeds="8MB"/>
<IfAccumulatedFileCount exceeds="5"/>
<IfLastModified age="9m"/>
</IfAny>
</IfFileName>
</IfFileName>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="WarnLogRollingFile" fileName="${log_base_dir}/my_app_warn.log"
filePattern="${log_base_dir}/$${date:yyyy_MM_dd}/my_app_warn_%d{yyyy_MM_dd_HH}_%">
<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${log_pattern}"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="${max_single_file_size}"/>
</Policies>
<DefaultRolloverStrategy fileIndex="nomax">
<Delete basePath="${log_base_dir}" maxDepth="2">
<IfFileName glob="*/my_app_warn_*.">
<IfAny>
<IfAccumulatedFileSize exceeds="3GB"/>
<IfAccumulatedFileCount exceeds="3000"/>
<IfLastModified age="30d"/>
</IfAny>
</IfFileName>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="ErrorLogRollingFile" fileName="${log_base_dir}/my_app_error.log"
filePattern="${log_base_dir}/$${date:yyyy_MM_dd}/my_app_error_%d{yyyy_MM_dd_HH}_%">
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${log_pattern}"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="${max_single_file_size}"/>
</Policies>
<DefaultRolloverStrategy fileIndex="nomax">
<Delete basePath="${log_base_dir}" maxDepth="2">
<IfFileName glob="*/my_app_error_*.">
<IfAny>
<IfAccumulatedFileSize exceeds="3GB"/>
<IfAccumulatedFileCount exceeds="3000"/>
<IfLastModified age="30d"/>
</IfAny>
</IfFileName>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<!-- 记录druid的SQL语句 -->
<RollingFile name="DruidSqlRollingFile" fileName="${log_base_dir}/druid.log"
filePattern="${log_base_dir}/$${date:yyyy_MM_dd}/druid_%d{yyyy_MM_dd_HH}_%">
<PatternLayout pattern="${log_pattern}"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="${max_single_file_size}"/>
</Policies>
<DefaultRolloverStrategy fileIndex="nomax">
<Delete basePath="${log_base_dir}" maxDepth="2" testMode="true">
<IfFileName glob="*/druid_*.">
<IfAny>
<IfAccumulatedFileSize exceeds="3GB"/>
<IfAccumulatedFileCount exceeds="3000"/>
<IfLastModified age="30d"/>
</IfAny>
</IfFileName>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</Appenders>
<!--定义logger,只有定义了logger并引⼊的appender,appender才会⽣效-->
<Loggers>
<!-- 当Logger在配置⽂件中声明时,就创建了⼀个LoggerConfig对象,两者⼀⼀对应,LoggerConfig包含⼀些Filter、这些
Filters⽤于过滤传递给任意Appender的LogEvent,它还包含⼀些Appender的引⽤。Logger本⾝执⾏⽆指向的动作,它仅含有⼀个与LoggerConfig关联的名称(通过name属性指定),root Logger具有固
定的默认名称,其他Logger需要指定各⾃的name属性

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。