log4j2配置详解

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:ss.SSS} [%-5level] %l - %m%n</property>
        <property name="logFilePattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%-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}/info.log" filePattern="${basePath}/%d{yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz">
            <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}/error.log" filePattern="${basePath}/%d{yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz">
            <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>
        <!-- 设置java.sql包下的日志只打印INFO及以上级别的日志,此设置可以支持sql语句的日志打印 -->
        <logger name="java.sql" 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. 系统属性 log4j2.configurationFile 指定的配置文件(可以是Url)。
  2. log4j2-test.properties
  3. log4j2-test.yaml、log4j2-test.yml
  4. log4j2-test.json、log4j2-test.jsn
  5. log4j2-test.xml
  6. log4j2.properties
  7. log4j2.yaml 、log4j2.yml
  8. log4j2.json、log4j2.jsn
  9. log4j2.xml
  10. DefaultConfiguration

Configuration 元素属性

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

Policy 触发策略

TimeBasedTriggeringPolicy

参数名称类型描述
intervalinteger根据日期格式中最具体的时间单位来决定应该多久发生一次rollover。例如,在日期模式中小时为具体的时间单位,那么每4小时会发生4次rollover,默认值为1
modulateboolean表示是否调整时间间隔以使在时间间隔边界发生下一个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="*.log.gz">
                <IfAny>
                    <IfAccumulatedFileSize exceeds="100M"/>
                    <IfAccumulatedFileCount exceeds="100"/>
                    <IfLastModified age="30d"/>
                </IfAny>
            </IfFileName>
        </Delete>
    </DefaultRolloverStrategy>
参数TypeDescription
fileIndexString可选值 max, min,nomax。nomax:将忽略DefaultRolloverStrategy的最大值和最小值。
mininteger最小文件数,默认1
maxinteger最大文件数,默认7。一旦达到这个值,旧的存档将在随后的滚动中被删除。
compressionLevelinteger设置压缩级别,0-9,其中0 =无,1 =最佳速度,到9 =最佳压缩。仅对ZIP文件实现。
tempCompressedFilePatternString归档日志文件在压缩过程中的文件名模式。

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

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

参数TypeDescription
basePathString从哪开始扫描。
maxDepthint最大扫描层次。maxDepth为0时只扫描baseDir本身maxDepth为1时只扫描baseDir目录下文档
pathConditionsPathCondition[]可以指定一个或多个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以上信息
appender.E.filter.threshold.type = ThresholdFilter
appender.E.filter.threshold.level = FATAL
appender.E.filter.threshold.onMatch = DENY
appender.E.filter.threshold.onMisMatch=NEUTRAL


appender.info_only.filter.threshold.type = LevelRangeFilter
appender.info_only.filter.threshold.minLevel = INFO
appender.info_only.filter.threshold.maxLevel = INFO
appender.info_only.filter.threshold.onMatch = ACCEPT
appender.info_only.filter.threshold.onMisMatch=DENY

附录

参考

官网

Filters 类型

properties语法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值