log4j2配置详解

时间:2025-03-22 21:03:46

Xml格式

<!-- status是log4j2自身内部的信息输出,可以不设置 
     monitorInterval是自动检测修改配置文件和重新配置本身,设置间隔秒数
-->
<configuration status="WARN" monitorInterval="3600">
    <Properties>
        <!-- 公共配置 -->
        <!-- log文件存放路径./当前工程目录下 -->
        <property name="basePath">./log2</property>
        <!-- 输入信息格式 -->
        <!-- 带行号显示,对日志输出的性能有影响,在控制台上点击可以直接定位到代码 -->
        <property name="consoleLogPattern">%d{yyyy-MM-dd HH:mm:} [%-5level] %l - %m%n</property>
        <property name="logFilePattern">%d{yyyy-MM-dd HH:mm:} [%-5level] %C.%M[%L line] - %m%n</property>
        <!-- 日志默认切割的最小单位 -->
        <property name="fileSize">100MB</property>
        <!-- 日志默认输出级别 -->
        <property name="outputLogLevel">DEBUG</property>
    </Properties>
    <!--定义appender -->
    <appenders>
        <!-- =======================================用来定义输出到控制台的配置======================================= -->
        <Console name="Console" target="SYSTEM_OUT">
            <!-- 设置控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
            <!-- 设置输出格式,不设置默认为:%m%n -->
            <PatternLayout pattern="${consoleLogPattern}"/>
        </Console>
   
        <!-- ============================打印INFO级别的日志到文件中======================= -->
        <!-- fileName:日志保存路径,filePattern:日志压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面进行压缩 -->
        <RollingFile name="InfoFile" fileName="${basePath}/" filePattern="${basePath}/%d{yyyy-MM}/info-%d{yyyy-MM-dd}-%">
            <PatternLayout pattern="${logFilePattern}"/>
            <Policies>
            <!--    interval:设置为1,filePattern是%d{yyyy-MM-dd}到天的格式,则间隔一天生成一个文件,如果设置为12,filePattern是%d{yyyy-MM-dd-HH}到小时的格式,则间隔12小时生成一个文件 
                    modulate:日志默认同类型日志,为true将以0点为边界进行调整
                -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="${fileSize}"/>
            </Policies>
            <!-- 日志默认同一文件夹下可以存放的数量,不设置此属性则默认为7个 -->
            <DefaultRolloverStrategy max="100" />
            <Filters>
                <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
        </RollingFile>
        <!-- ============================打印ERROR级别的日志到文件中=======配置和INFO的一样,就修改下保存文件名称和压缩文件名称==================== -->
        <RollingFile name="ErrorFile" fileName="${basePath}/" filePattern="${basePath}/%d{yyyy-MM}/error-%d{yyyy-MM-dd}-%">
            <PatternLayout pattern="${logFilePattern}"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="${fileSize}"/>
            </Policies>
            <DefaultRolloverStrategy max="100" />
            <Filters>
                <ThresholdFilter level="FATAL" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
        </RollingFile>
    </appenders>
    <!--定义logger,只有定义了logger并引入的appender,appender才会生效-->
    <loggers>
        <!-- 设置包下的日志只打印INFO及以上级别的日志,此设置可以支持sql语句的日志打印 -->
        <logger name="" level="INFO" additivity="false">
            <appender-ref ref="Console"/>
        </logger>
        <!--建立一个默认的root的logger-->
        <root level="${outputLogLevel}">
            <appender-ref ref="Console"/>
            <appender-ref ref="InfoFile"/>
            <appender-ref ref="ErrorFile"/>
        </root>
    </loggers>
</configuration>

配置

自动配置

log4j2支持4种格式的配置:json、yaml、xml、peroperties。加载顺序为:

  1. 系统属性 指定的配置文件(可以是Url)。
  2. DefaultConfiguration

Configuration 元素属性

  • monitorInterval:自动监控更新,单位(秒)
  • status:log4j2的日志等级

Policy 触发策略

TimeBasedTriggeringPolicy

参数名称 类型 描述
interval integer 根据日期格式中最具体的时间单位来决定应该多久发生一次rollover。例如,在日期模式中小时为具体的时间单位,那么每4小时会发生4次rollover,默认值为1
modulate boolean 表示是否调整时间间隔以使在时间间隔边界发生下一个rollover。例如:假设小时为具体的时间单元,当前时间为上午3点,时间间隔为4,第一次发送rollover是在上午4点,接下来是上午8点,接着是中午,接着是下午4点等发生。

TimeBasedTriggeringPolicy切分文件策略,是基于filePattern中的%d{yyyy-MM-dd-HH-mm-ss}来决定到底采用哪种时间单位(天、小时、分钟、秒等)。filePattern日期格式精确到哪一位,interval 也精确到哪一个单位。注意filePattern中配置的文件重命名规则是 %d{yyyy-MM-dd HH-mm-ss}-%i,最小的时间粒度是 ss,即秒钟。 TimeBasedTriggeringPolicy 默认的 size 是 1,结合起来就是每 1 秒钟生成一个新文件。如果改成 %d{yyyy-MM-dd HH},最小粒度为小时,则每一个小时生成一个文件

modulate,说明是否对封存时间进行调制。若 modulate=true, 则封存时间将以 0 点为边界进行偏移计算。比如,modulate=true,interval=4hours, 那么假设上次封存日志的时间为 03:00,则下次封存日志的时间为 04:00, 之后的封存时间依次为 08:00,12:00,16:00。

切分也是基于最后一部分,增加 interval。是以程序启动时间。

SizeBasedTriggeringPolicy

size属性:可以为字节,千字节,兆字节,千兆字节,通过在数值后面指定一个后缀 KB,MB 或者 GB

CronTriggeringPolicy

基于Cron表达式的触发策略。

<CronTriggeringPolicy schedule="0/5 * * * * ?" />

Strategy 滚动策略

DefaultRolloverStrategy

DefaultRolloverStrategy制定了默认的rollover策略,通过max参数可控制一定时间范围内归档的日志文件的最大个数。

    <DefaultRolloverStrategy fileIndex="nomax">
        <Delete basePath="${LOG_HOME}" maxDepth="2">
            <IfFileName glob="*.">
                <IfAny>
                    <IfAccumulatedFileSize exceeds="100M"/>
                    <IfAccumulatedFileCount exceeds="100"/>
                    <IfLastModified age="30d"/>
                </IfAny>
            </IfFileName>
        </Delete>
    </DefaultRolloverStrategy>
参数 Type Description
fileIndex String 可选值 max, min,nomax。nomax:将忽略DefaultRolloverStrategy的最大值和最小值。
min integer 最小文件数,默认1
max integer 最大文件数,默认7。一旦达到这个值,旧的存档将在随后的滚动中被删除。
compressionLevel integer 设置压缩级别,0-9,其中0 =无,1 =最佳速度,到9 =最佳压缩。仅对ZIP文件实现。
tempCompressedFilePattern String 归档日志文件在压缩过程中的文件名模式。

:第四次和随后的归档,被删除,被重命名为,被重命名为,被重命名为。创建新的文件并继续写入。

:第四次和随后的归档,删除,将重命名为,将重命名为,将重命名为foo -。创建新的文件并继续写入。

参数 Type Description
basePath String 从哪开始扫描。
maxDepth int 最大扫描层次。maxDepth为0时只扫描baseDir本身maxDepth为1时只扫描baseDir目录下文档
pathConditions PathCondition[] 可以指定一个或多个PathCondition元素。如果指定了多个PathCondition元素,则需要所有的PathCondition结果都为true才会进行删除。

PathCondition也可以嵌套。如果进行嵌套,则是先判断外层的PathCondition,然后进行内层的判断。如果没有嵌套,则是按顺序进行判断。
也可以创建自定义条件或使用内置条件:
IfFileName 如果文件名与此参数匹配则结果为true,此参数为正则表达式或 glob的文件。
IfLastModified 最后修改时间早于或等于此参数则结果为true,此参数为duration。
IfAccumulatedFileCount 文件数超过指定个数则结果为true,此参数为整型。
IfAccumulatedFileSize 所有文件总大小达到此参数则结果为true,此参数为KB、MB、GB。

IfAll 如果此标签下的所有条件都配置成功(逻辑与),则结果为true。
IfAny 如果此标签下的任何一个条件匹配成功(逻辑或),则结果为true。
IfNot 如果此标签下的所有条件都不匹配(逻辑非),则结果为true。

Filters

Log4j允许在以下4个位置中指定过滤器:

  1. appendersloggersproperties元素处于同一级别。这些过滤器可以接受 或者在将事件传递给LoggerConfig之前拒绝事件。
  2. logger元素中。这些过滤器可以接受或拒绝特定记录器的事件。
  3. appender元素中。这些筛选器可以阻止或导致事件被 appender。
  4. appender引用元素中。这些过滤器用于确定记录器是否应路由 将事件添加到appender。

ThresholdFilter

默认值: <ThresholdFilter level="INFO" onMatch="NEUTRAL" onMismatch="DENY"/>

说明:

  • onMatch:大于、等于 level 级别的。
  • onMismatch:小于 level 级别的。
  • ACCEPT: 表示接受该事件,不再将其传递到过滤器链的下一个元素。
  • DENY: 表示拒绝该事件,不再将其传递到过滤器链的下一个元素。
  • NEUTRAL: 表示不做出决定,将事件传递到过滤器链的下一个元素。
            <Filters>
                <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>

MarkerFilter

      <filters>
        <MarkerFilter marker="FLOW" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
        <MarkerFilter marker="EXCEPTION" onMatch="ACCEPT" onMismatch="DENY"/>
      </filters>

ThreadContextMapFilter

        <ThreadContextMapFilter>
          <KeyValuePair key="test" value="123"/>
        </ThreadContextMapFilter>

properties格式

#过滤ERROR以上信息
 = ThresholdFilter
 = FATAL
 = DENY
=NEUTRAL


appender.info_only. = LevelRangeFilter
appender.info_only. = INFO
appender.info_only. = INFO
appender.info_only. = ACCEPT
appender.info_only.=DENY

附录

参考

官网

Filters 类型

properties语法

#公告配置,log文件存放路径
 = ./log22
#控制台数据
 = Console
 = console
#输出布局类型
 = PatternLayout
#输入信息格式
 =  %-d{yyyy-MM-dd HH:mm:ss,SSS} [%p] %c %m%n
#级别过滤
 = ThresholdFilter
#日志输出的级别
 = info
#===================自定义文件输入====================
 = RollingFile
 = infoLogFile
#输出文件保存地址
=${filename}/
#输入文件滚动时,文件重命名规则
 = ${filename}/info-%d{MM-dd-yy-HH-mm-ss}-%
 = PatternLayout
#输入信息格式
=[%-5level] %d{yyyy-MM-dd HH:mm:} %c{1} [%t] - %msg%n
 = Policies
#输入日志文件大小的触发策略
 = SizeBasedTriggeringPolicy
#输入日志文件有100MB触发策略
=100MB
 = DefaultRolloverStrategy
 = 5
#INFO级别数据写入文件中,
 = ThresholdFilter
 = INFO
 = ACCEPT
=DENY
#第二个配置error的和上面配置info的一样就是名称要修改下
 = RollingFile
 = errorLogFile
=${filename}/
 = ${filename}/error-%d{MM-dd-yy-HH-mm-ss}-%
 = PatternLayout
=[%-5level] %d{yyyy-MM-dd HH:mm:} %c{1} [%t] - %msg%n
 = Policies
 = SizeBasedTriggeringPolicy
=100MB
 = DefaultRolloverStrategy
 = 5
 = ThresholdFilter
 = INFO
 = ACCEPT
=DENY
#根记录器
 = info
 = console
 = errorLogFile
 = error
 = infoLogFile
 = info