配置文件中各标签详解

时间:2025-03-22 21:20:49

log4j2.0以后我们通常在中配置相关参数,在配置的时候我们需要理解这些参数的具体含义,下面列出了这些参数的解释。

1、Logger 完成日志信息的处理

<logger name="" level="INFO" additivity="true">
    <appender-ref ref="INFO" />
    <appender-ref ref="WARN" />
    <appender-ref ref="ERROR" />
    <appender-ref ref="Mail" />
</logger>

logger中的name是指代码的包名或类名,路径要写全,可以配置不同包中的日志输出到不同的文件中。level是日志输出级别,定义输出的层次和决定信息是否输出,

DEBUG<INFO<WARN<ERROR

additivity设置事件是否在root logger输出,为了避免重复输出,可以在Logger 标签下设置additivity为”false”。

2、Appender 设置在哪输出日志信息
FileAppender 普通地输出到本地文件
FlumeAppender将几个不同源的日志汇集、集中到一处。
JMSQueueAppender VS. JMSTopicAppender与JMS相关的日志输出
RewriteAppender 对日志事件进行掩码或注入信息
RollingFileAppender对日志文件进行封存(详细)
RoutingAppender在输出地之间进行筛选路由
SMTPAppender将LogEvent发送到指定邮件列表
SocketAppender将LogEvent以普通格式发送到远程主机
SyslogAppender将LogEvent以RFC 5424格式发送到远程主机
AsynchAppender 将一个LogEvent异步地写入多个不同输出地
ConsoleAppender将LogEvent输出到命令行
FailoverAppender维护一个队列,系统将尝试向队列中的Appender依次输出LogEvent,直到有一个成功为止

其中ConsoleAppender、RollingFileAppender和SMTPAppender较为常用。如果想详细了解,可以参考log4j的官方文档

ConsoleAppender将输出写到或。如果想将输出写到,设置Console标签下的target为”SYSTEM_OUT”即可;如果想将输出写到,设置Console标签下的target为”SYSTEM_ERR “即可。

RollingFileAppender跟FileAppender的基本用法一样。但RollingFileAppender可以设置log文件的size(单位:KB/MB/GB)上限、数量上限,当log文件超过设置的size上限,会自动被压缩。RollingFileAppender可以理解为滚动输出日志,如果log4j 2记录的日志达到上限,旧的日志将被删除,腾出的空间用于记录新的日志,DefaultRolloverStrategy 标签的max设置压缩文件的上限(默认值为7)。

SMTPAppender主要用来给指定的E-mail发送log event。

<SMTP name="Mail" subject="****SaaS系统正式版异常信息" to="@lengjing.info" from="message@lengjing.info" smtpUsername="message@lengjing.info" smtpPassword="LENG****1234" smtpHost="" smtpDebug="false" smtpPort="25" bufferSize="10">
    <PatternLayout pattern="[%-5p]:%d{YYYY-MM-dd HH:mm:ss} [%t] %c{1}:%L - %msg%n" />
        </SMTP>

SMTPAppender默认情况下只发送ERROR级别以上的日志,在测试的时候会发现低级别的日志是不会通过邮箱发送的。

3、Layout 设置日志信息的输出格式
layout有以下几种:
.(以HTML表格形式布局)
.(包含日志讯息的级别和讯息字符串)
.(包含日志产生的时间、执行绪、类别等讯息)
.(可以灵活地指定布局格式)

详细配置可以参考官方文档

4,Filters
Filter可以过滤log事件,并控制log输出,详细配置可以参考官方文档

例如ThresholdFilter 可以实现单个log级别的过滤功能。

5,Status

<Configuration status="OFF" monitorInterval="30">

log4j 2定义的status级别有8个:ALL,TRACE, DEBUG, INFO, WARN, ERROR ,FATAL,OFF。其实status属性是帮助开发者找错用的,它可以检测log4j 2的配置文件是否有错,也可以检测到死循环的logger。

6,monitorInterval

<Configuration status="OFF" monitorInterval="30">

通过设置monitorInterval属性,即可设置log4j 2自动检测配置文件的时间间隔(单位:秒),最小间隔为5秒。log4j 2检测到配置文件有变化,会重新配置自己。

7,Policies 配置日志相关策略
SizeBasedTriggeringPolicy 设置日志大小达到一定大小后打包生成压缩文件。
TimeBasedTriggeringPolicy 基于时间的触发策略。该策略主要是完成周期性的log文件封存工作。有两个参数:
interval,integer型,指定两次封存动作之间的时间间隔。单位:以日志的命名精度来确定单位,比如yyyy-MM-dd-HH 单位为小时,yyyy-MM-dd-HH-mm 单位为分钟。
modulate,boolean型,说明是否对封存时间进行调制。若modulate=true,则封存时间将以0点为边界进行偏移计算。比如,modulate=true,interval=4hours,那么假设上次封存日志的时间为03:00,则下次封存日志的时间为04:00,之后的封存时间依次为08:00,12:00,16:00。

这里将我在项目中常用配置贡献给大家,可以满足大部分需求。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF" monitorInterval="30">
    <properties>
        <!--设置日志在硬盘上输出的目录-->
        <property name="logPath">D:/ljzx_log</property>
    </properties>

    <Appenders>
        <!--设置在控制台打印日志-->
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%-5p]:%d{YYYY-MM-dd HH:mm:ss} [%t] %c{1}:%L - %msg%n" />
        </Console>

        <!--设置级别为INFO日志输出到中-->
        <RollingFile name="INFO" filename="${logPath}/"
                     filepattern="${logPath}/%d{YYYYMMdd}-%">
            <Filters>
                <!--设置只输出级别为INFO的日志-->
                <ThresholdFilter level="INFO"/>
                <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout pattern="[ %-5p]:%d{YYYY-MM-dd HH:mm:ss} [%t] %c{1}:%L - %msg%n" />
            <Policies>
                <!--设置每天打包日志一次-->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <!--设置日志文件满1MB后打包-->
                <SizeBasedTriggeringPolicy size="1 MB" />
            </Policies>
            <DefaultRolloverStrategy max="20" />
        </RollingFile>

        <!--设置级别为WARN日志输出到中-->
        <RollingFile name="WARN" filename="${logPath}/"
                     filepattern="${logPath}/%d{YYYYMMdd}-%">
            <Filters>
                <!--设置只输出级别为WARN的日志-->
                <ThresholdFilter level="WARN"/>
                <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout pattern="[ %-5p]:%d{YYYY-MM-dd HH:mm:ss} [%t] %c{1}:%L - %msg%n" />
            <Policies>
                <!--设置每天打包日志一次-->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <!--设置日志文件满1MB后打包-->
                <SizeBasedTriggeringPolicy size="1 MB" />
            </Policies>
            <DefaultRolloverStrategy max="20" />
        </RollingFile>

        <!--设置级别为ERROR日志输出到中-->
        <RollingFile name="ERROR" filename="${logPath}/"
                     filepattern="${logPath}/%d{YYYYMMdd}-%">
            <!--设置只输出级别为ERROR的日志-->
            <ThresholdFilter level="ERROR"/>
            <PatternLayout pattern="[ %-5p]:%d{YYYY-MM-dd HH:mm:ss} [%t] %c{1}:%L - %msg%n" />
            <Policies>
                <!--设置每天打包日志一次-->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <!--设置日志文件满1MB后打包-->
                <SizeBasedTriggeringPolicy size="1 MB" />
            </Policies>
            <DefaultRolloverStrategy max="20" />
        </RollingFile>

        <!--设置通过邮件发送日志信息-->
        <SMTP name="Mail" subject="XXXXSaaS系统正式版异常信息" to="@" from="message@" 
              smtpUsername="message@" smtpPassword="LENG****1234" smtpHost="" smtpDebug="false" 
              smtpPort="25" bufferSize="10">
            <PatternLayout pattern="[%-5p]:%d{YYYY-MM-dd HH:mm:ss} [%t] %c{1}:%L - %msg%n" />
        </SMTP>
    </Appenders>

    <Loggers>
        <logger name="" level="INFO" additivity="true">
            <appender-ref ref="INFO" />
            <appender-ref ref="WARN" />
            <appender-ref ref="ERROR" />
            <appender-ref ref="Mail" />
        </logger>
        <root level="DEBUG">
            <appender-ref ref="Console"/>
        </root>
    </Loggers>
</Configuration>