log4j2.xml常用配置介绍(Log4j2配置文件)

2 篇文章 0 订阅

一直对Log4j2的配置文件没有一个全局的清晰认识,于是去查看了官网文档,对常用配置做了一些官网的翻译和理解,整体配置文档译自官网:http://logging.apache.org/log4j/2.x/manual/configuration.html

目录

一、配置文件框架

二、XML配置

三、配置详细介绍

1、< Configuration >

2、< Appenders >

< RollingFileAppender >  

3、< Loggers >

< Logger >

< Root > 

4、配置过滤器< Filters >

5、< Properties >

四、 log4j2.xml案例分析


一、配置文件框架

首先给出一个最简单的日志配置格式

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
  </Appenders>
  <Loggers>
    <Root level="debug">
      <AppenderRef ref="Console"/>
    </Root>
  </Loggers>
</Configuration>

启动项目会得到一些这样的打印。 修改<Root level="debug">的日志打印级别,会得到不同的打印结果。

11:47:55.888 [main] INFO  com.fc.asset.FcAssetApplication - Starting FcAssetApplication on 
11:47:55.890 [main] DEBUG com.fc.asset.FcAssetApplication - Running with Spring Boot v2.3.1.RELEASE, Spring v5.2.7.RELEASE
11:47:55.890 [main] INFO  com.fc.asset.FcAssetApplication - No active profile set, falling back to default profiles: default
11:47:55.890 [main] DEBUG org.springframework.boot.SpringApplication - Loading source class com.fc.asset.FcAssetApplication

二、XML配置

log4j2支持多种格式的配置文件,例如XML、Json等,本篇文章以XML为例。可以使用两种格式配置log4j2.xml, 可以在其父元素下声明标签,也可以在父元素中增加一个属性,且元素和属性名均不区分大小写,因此:以下几种配置效果相同但推荐标签首字母大写,属性小写

<PatternLayout pattern="%m%n"/>
<patternLayout PATTERN="%m%n"/>
<PatternLayout>
  <Pattern>%m%n</Pattern>
</PatternLayout>

除了上述简洁的XML格式外,Log4j还允许以更“常规”的XML方式指定配置,可以将上面的标签名称替换为对象类型来实现。例如,不是使用名为Console的标签来配置ConsoleAppender,而是将其配置为具有包含“ Console”的type属性的appender标签。

<Appenders>
    <Appender type="Console" name="xxx">
        ...
    </Appender>
</Appenders>

三、配置详细介绍

1、< Configuration >

常用属性(其余属性略):

属性名称描述
status

记录到控制台的内部Log4j事件的级别。此属性的有效值为“ trace”,“ debug”,“ info”,“ warn”,“ error”和“ fatal”。Log4j将有关初始化、过渡和其他内部操作的详细信息记录到状态记录器中。如果需要对log4j进行故障排除,则可设置status =“ trace”

(或者,设置系统属性log4j2.debug也会将内部Log4j2日志记录打印到控制台,包括在找到配置文件之前进行的内部日志记录。)

monitorInterval从文件配置后,Log4j能够自动检测对配置文件的更改并自行重新配置。如果在配置元素上指定了monitorInterval属性,并且将其设置为非零值,则下次评估和/或记录日志事件并且自上次检查以来已经过monitorInterval时,将检查文件。下例显示了如何配置属性,以便仅在至少30秒之后检查配置文件的更改。最小间隔为5秒。

例如:

<configuration status="WARN" monitorInterval="30">

2、< Appenders >

该部分详细配置可见官网:http://logging.apache.org/log4j/2.x/manual/appenders.html

<Appenders>负责将日志传送至配置目的地,配置日志打印内容、格式、方式、保存策略等。

可以使用特定的appender标签名称或者<appender>标签+type属性来配置appender,都必须有name属性,且该name值唯一,该name将在<Logger>标签中被使用。

常用标签:

标签名称描述
<Console>控制台日志打印配置
<File>最普通的文件日志打印配置
<RollingFileAppender>增加了缓存和滚动策略的文件日志打印配置
<RollingRandomAccessFile>RollingRandomAccessFileAppender与RollingFileAppender相似,除了它会被缓存且在内部它使用ByteBuffer + RandomAccessFile而不是BufferedOutputStream。与RollingFileAppender相比,性能提高了20-200%。

< RollingFileAppender >  

是Log4j2中的一种能够实现日志文件滚动更新(rollover)的Appender。

  • 其支持缓存并可设置缓存大小,默认开启,记录首先会写入缓冲区,当缓冲区满再写入磁盘,性能显著提高
  • 支持文件滚动更新,当文件的大小或时间满足一定条件,可自动将日志写入新的文件

常用属性: 

属性或标签名称描述
nameAppender name,必填
fileName存储文件名
filePattern

文件归档名模式、滚动策略(当文件大小或时间满足一定条件,则写入新的日志文件)

其中SimpleDateFormat兼容的日期/时间模式决定滚动时间策略的时间单位

%i代表从1开始的整数计数器,%3i可将计数器填充至三位,%03i可用0将计数器填充到3位

layout日志打印格式
policy日志需要滚动归档的触发条件,例如:文件大小、时间
<DefaultRolloverStrategy>

通过max属性设置同一时间的整数计算器下最多的日志文件数,超过后从最旧的开始自动删除

 

<Delete>标签相比max属性可更好的控制删除哪些文件,可配置一个或多个条件:

可以删除任何文件,而不仅仅是删除日志文件,因此请谨慎使用此操作! 使用testMode参数可以测试配置,而不会意外删除错误的文件。

 以下滚动策略为:每当日志生成超过1天,或者大小超过20MB,就生成新的日志文件进行滚动归档。如果不设置每个日志的容量大小,则不论interval是几天,结尾计算器永远是_1,因为在这个不重复的时间段内只会有一个日志文件,即使时间间隔是两天。

modulate=true:时间修正,从0点开始计算interval而不是从现在开始。

其中:

<TimeBasedTriggeringPolicy>的interval属性与filePttern中日期单位联动,当日期格式到天,则单位为天,如果是yyyy-MM-dd HH:mm:ss则单位为秒,一秒钟生成一个历史文件。

<RollingRandomAccessFile name="normalLog" fileName="${LOG_HOME}/fc-asset.log"
                                 filePattern = "${HISTORY_LOG_HOME}/fc-asset_%d{yyyy-MM-dd}_%i.log">
    <Policies>
        <SizeBasedTriggeringPolicy size="20 MB" />
        <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
    </Policies>
</RollingRandomAccessFile>

3、< Loggers >

日志打印配置,只有此处配置了Appender,Appender才会生效。

< Logger >

属性名称描述
name必填,该项仅打印包含该name的日志信息
level非必填,默认ERROR。日志打印级别,可以配置为TRACE,DEBUG,INFO,WARN,ERROR,ALL或OFF之一
additivity非必填,默认true。该Logger是否附加给Root(此参数详细介绍看<Root>)

log4j2允许日志打印到一个或多个目标文件,该标签可以配置一个或多个AppenderRef子元素,ref属性值与该name的Appender关联,每一个Appender为一个日志输出目标。

< Root > 

Root用来收集所有的<Logger>设置的日志打印,每个log4j2的配置都必须有,但可缺省,使用默认的root具有error级别,并且仅附加Console控制台打印。

以下配置了<Root>并将其打印级别设置为info,因此上面的name为"test"的<Logger>的additivity属性必须设置为false,就不会反馈到<Root>中;否则"apiLog"的Appender的info级别上的日志,将分别在<Logger name="test">和<Root>中被打印两次。

<Loggers>
    <Logger name="test" level="trace" additivity="false">
        <AppenderRef ref="apiLog"/>
    </Logger>
    <Root level="info">
        <AppenderRef ref="apiLog"/>
        <AppenderRef ref="errLog"/>
    </Root>
</Loggers>

4、配置过滤器< Filters >

该部分详细配置可见官网文档:http://logging.apache.org/log4j/2.x/manual/filters.html

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

  1. 在<configuration>标签下,与<Appenders>、<Logger>等标签平级,这些过滤器可以在事件传递到LoggerConfig之前接受或拒绝事件。
  2. 在<Appender>标签下,这些过滤器可以接受或拒绝特定appender的事件。
  3. 在<Logger>标签下,这些过滤器可以防止或导致事件由logger处理。
  4. 在<Logger>标签的<AppenderRef>标签下,这些过滤器用于确定Logger是否应将事件路由到Appender。

常用Filter标签介绍:

标签名称描述
<ThresholdFilter>

允许或阻止不同级别的日志打印。>=level配置的日志级别将匹配onMatch,否则匹配onMismatch;

例如:<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>该日志将打印info及info级别以上日志,其余不打印

5、< Properties >

Log4j2支持在配置中定义全局属性,name属性必须存在且唯一,允许使用${name}来引用该变量。

例如:以下配置定了LOG_HOME的全局属性

<Properties>
    <Property name="LOG_HOME">../logs/xxx</Property>
</Properties>

要使用该属性,需要使用${LOG_HOME} 来引用

<File name="File" fileName="${LOG_HOME}/xxx.log">
    ...
</File>

四、 log4j2.xml案例分析

在文章的最后,给一个简单的log4j2.xml配置文件案例:

<?xml version="1.0" encoding="UTF-8"?>

<!-- status记录到控制台的内部Log4j事件的级别,可缺省 -->
<!-- monitorInterval设置检查文件更改间隔时间,单位S,每秒检查一次 -->
<configuration status="WARN" monitorInterval="1">

    <!--日志打印级别: fatal > error > warn > info > debug > trace -->

    <!-- 全局变量,通过${name}引用该变量 -->
    <Properties>
        <!-- 日志打印路径 -->
        <Property name="LOG_HOME">../logs/fc-asset</Property>
        <!-- 历史日志打印路径 -->
        <Property name="HISTORY_LOG_HOME">${LOG_HOME}/history</Property>
        <!-- 统一日志打印格式:2020-07-01 21:14:48, 987 [main] [INFO] [com.fc.asset.FcAssetApplication] [FcAssetApplication.java:15] - message -->
        <Property name="LOG_PATTERN"
                  value="%date{yyyy-MM-dd HH:mm:ss, SSS} [%thread] [%-5level] [%logger{36}] [%file:%line] - %msg%n"/>
    </Properties>

    <!-- 负责将日志传送至配置目的地,配置日志打印内容、格式、方式、保存策略等 -->
    <Appenders>
        <!-- 控制台日志打印配置 -->
        <console name="Console" target="SYSTEM_OUT">
            <!-- 打印格式 -->
            <PatternLayout charset="UTF-8" pattern="${LOG_PATTERN}"/>
        </console>

        <!-- 文件打印配置,支持文件滚动归档和缓存;filePattern设置滚动单位为S,%i代表从1开始的正整数,%3i可为3位 -->
        <RollingRandomAccessFile name="normalLog" fileName="${LOG_HOME}/fc-asset.log"
                                 filePattern="${HISTORY_LOG_HOME}/fc-asset_%d{yyyy-MM-dd HH:mm:ss}_%i.log">
            <!-- 打印格式 -->
            <PatternLayout charset="UTF-8" pattern="${LOG_PATTERN}"/>
            <!-- 滚动策略 -->
            <Policies>
                <!-- 文件每超过1KB就生成一个新的日志文件 -->
                <SizeBasedTriggeringPolicy size="1KB"/>
                <!-- 每2秒生成一个新的日志文件,并修正时间 -->
                <TimeBasedTriggeringPolicy interval="2" modulate="true"/>
            </Policies>
            <!-- 同一秒的日志文件最多只能拆分两个 -->
            <DefaultRolloverStrategy max="2"/>
        </RollingRandomAccessFile>
    </Appenders>

    <!-- 日志打印配置,只有此处配置了Appender,Appender才会生效 -->
    <Loggers>
        <!-- 只打印包含com.fc.asset内容的日志,打印级别为trace,并将其反馈至Root中 -->
        <Logger name="com.fc.asset" level="trace" additivity="true">
            <AppenderRef ref="normalLog"/>
        </Logger>
        <!-- Root设置打印级别为info,打印控制台 -->
        <Root level="info">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</configuration>

日志打印结果:

根据以上的滚动策略配置可知,生成的日志为2秒一个,且设置了1KB文件大小的容量,每一个计数器内的日志个数不能超过2,完美符合。

以上配置如果删去<SizeBasedTriggeringPolicy size="1KB"/>的文件大小滚动策略,即使时间滚动是2秒一个,文件结尾则永远是_1的情况,因为时间作为的文件名已经不重复,不需要结尾计数器来区分,打印结果如下:

  

  • 8
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
log4j2是一个流行的Java日志框架,可以通过log4j2.xml文件进行配置。下面是log4j2.xml文件的配置详解: 1. 配置文件动态刷新配置 可以使用monitorInterval属性来设置配置文件的动态刷新间隔,单位为秒。例如: ```xml <Configuration monitorInterval="30"> ``` 2. Configuration的status属性 Configuration标签有一个status属性,用于指定日志记录器的状态。可以设置为debug、info、warn、error、fatal。例如: ```xml <Configuration status="warn"> ``` 3. 日志级别 可以使用属性level来指定日志级别,可以设置为trace、debug、info、warn、error、fatal、off。例如: ```xml <Logger name="com.foo.Bar" level="trace"> ``` 4. Logger与Root标签 Logger标签用于指定特定的类或包的日志级别,而Root标签用于指定所有日志记录器的默认日志级别。例如: ```xml <Root level="error"> <AppenderRef ref="Console"/> </Root> <Logger name="com.foo.Bar" level="trace"> <AppenderRef ref="RollingFile"/> </Logger> ``` 5. Logger的additivity属性 Logger标签还有一个additivity属性,用于指定是否将日志事件传递给父记录器。默认情况下,Logger的additivity属性为true。例如: ```xml <Logger name="com.foo.Bar" level="trace" additivity="false"> ``` 6. appender-ref的ref属性 可以使用appender-ref标签来引用appender。例如: ```xml <Logger name="com.foo.Bar" level="trace"> <AppenderRef ref="RollingFile"/> </Logger> ``` 7. appender 可以使用appender标签来指定日志输出的目的地,例如控制台或文件。常用的appender有Console、File、RollingFile等。例如: ```xml <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz"> <PatternLayout pattern="%d %p %c{1.} [%t] %m%n"/> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="250 MB"/> </Policies> </RollingFile> </Appenders> ``` 8. Patterns 可以使用PatternLayout标签来指定日志输出的格式。例如: ```xml <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> ``` 9. Java使用Log4j2 可以使用以下步骤在Java中使用Log4j2: 1)导入pom依赖 ```xml <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.14.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.14.1</version> </dependency> ``` 2)配置Log4j2.xml 3)使用日志 ```java import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class MyClass { private static final Logger logger = LogManager.getLogger(MyClass.class); public void doSomething() { logger.debug("Debug message"); logger.info("Info message"); logger.warn("Warn message"); logger.error("Error message"); logger.fatal("Fatal message"); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值