java日志框架log4j2配置详解

时间:2024-10-13 07:36:56

官方文档:/log4j//manual/

Log4j2简介
log4j2是log4j 的升级版,2015年5月,Apache宣布 停止更新。最新版为1.2.17。

log4j2借鉴了logback的一些优秀的设计,并且修复了一些问题,因此带来了一些重大的提升,主要有:
1、异常处理:在logback中,Appender中的异常不会被应用感知到,但是在log4j2中,提供了一些异常处理机制
2、性能提升:log4j2相较于log4j 1和logback都具有很明显的性能提升,在异步配置下是logback的10倍左右。
3、自动重载配置:参考了logback的设计,提供自动刷新参数配置,可以动态的修改日志的级别而不需要重启应用。
4、无垃圾机制,log4j2在大部分情况下,都可以使用其设计的一套无垃圾机制,避免频繁的日志收集导致的jvm gc。

  • java本地测试
    添加依赖
<dependencies>  
    <dependency>  
        <groupId>.log4j</groupId>  
        <artifactId>log4j-api</artifactId>  
        <version>2.7</version>  
    </dependency>  
    <dependency>  
        <groupId>.log4j</groupId>  
        <artifactId>log4j-core</artifactId>  
        <version>2.7</version>  
    </dependency>  
</dependencies>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • springboot需要加入:
        <dependency>
            <groupId></groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions><!-- 去掉默认配置 -->
                <exclusion>
                    <groupId></groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

		<dependency>
		    <groupId></groupId>
		    <artifactId>spring-boot-starter-log4j2</artifactId>
		</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

具体的配置如下:
在resource文件下创建

<?xml version="1.0" encoding="UTF-8"?>
<!-- monitorInterval配置成一个正整数,则每隔这么久的时间(秒),log4j2会刷新一次配置。如果不配置则不会动态刷新 -->
<configuration status="info" monitorInterval="600" >

    <properties>
        <property name="LOG_HOME">D:/logs</property>
        <property name="FILE_NAME_INFO">std</property>
        <property name="FILE_NAME_ERROR">error</property>
    </properties>
    <!--先定义所有的appender -->
    <Appenders>
        <!--这个输出控制台的配置 -->
        <Console name="Console" target="SYSTEM_OUT">
            <!--             控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
            <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--             这个都知道是输出日志的格式 -->
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:} %-5level (%class{36}.java %L) %M - %msg%n"/>
        </Console>

        <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用 -->
        <!--append为TRUE表示消息增加到指定文件中,false表示消息覆盖指定的文件内容,默认值是true -->
        <RollingRandomAccessFile   name="info" fileName="${LOG_HOME}/${FILE_NAME_INFO}.log" append="true"
                                  filePattern="${LOG_HOME}/${FILE_NAME_INFO}.log.%d{yyyy-MM-dd}">
            <Policies>
                <!-- TimeBasedTriggeringPolicy :时间滚动策略,默认0点小时产生新的文件, modulate="true" : 产生文件是否以0点偏移时间-->
                <TimeBasedTriggeringPolicy/>
            </Policies>
            <!--       日志输出格式     -->
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:} %-5level (%class{36}.java %L) %M - %msg%n"/>
        </RollingRandomAccessFile  >

        <!--添加过滤器Filters,可以有选择的输出某个级别以上的类别  onMatch="ACCEPT" onMismatch="DENY"意思是匹配就接受,否则直接拒绝  -->
        <RollingRandomAccessFile   name="error" fileName="${LOG_HOME}/${FILE_NAME_ERROR}.log"
                                  filePattern="${LOG_HOME}/${FILE_NAME_INFO}.log.%d{yyyy-MM-dd}">
            <Policies>
                <!-- TimeBasedTriggeringPolicy :时间滚动策略,默认0点小时产生新的文件, modulate="true" : 产生文件是否以0点偏移时间-->
                <TimeBasedTriggeringPolicy/>
            </Policies>

            <Filters>
                <!-- 只记录error级别信息 -->
                <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <!--             这个都知道是输出日志的格式 -->
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:} %-5level (%class{36}.java %L) %M - %msg%n"/>
        </RollingRandomAccessFile  >
    </Appenders>


    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
    <loggers>
        <root level="info">
            <appender-ref ref="Console"/>
            <appender-ref ref="error" />
            <appender-ref ref="info"/>
        </root>
        <!--        向 root 上报这个包下的debug级别的日志-->
        <logger name = "" level="debug" />
    </loggers>
</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

测试如下:
本地配置
测试代码:
测试代码
输出如下:
在这里插入图片描述
输出:
在这里插入图片描述
输出:
在这里插入图片描述

这就完成了log4j2的输出配置。

log4j2配置说明
log4j 版本不再支持像中的.properties后缀的文件配置方式,版本常用.xml后缀的文件进行配置,除此之外还包含.json和.jsn配置文件

log4j2虽然采用xml风格进行配置,依然包含三个组件,分别是 Logger(记录器)、Appender(输出目的地)、Layout(日志布局)。

XML配置文件解析
1、根节点Configuration有两个属性:status和monitorinterval,有两个子节点:Appenders和Loggers(表明可以定义多个Appender和Logger).
status用来指定log4j本身的打印日志的级别.
monitorinterval为log4j 新特点自动重载配置。指定自动重新配置的监测间隔时间,单位是s,最小是5s。

2、Appenders节点,常见的有三种子节点:Console、File、RollingFile
Console节点用来定义输出到控制台的Appender.
File节点用来定义输出到指定位置的文件的Appender.
RollingFile节点用来定义超过指定大小自动删除旧的创建新的的Appender.

通过在子节点中加入进行日志布局
复制代码

%c 输出所属类的全名,可写为 %c{Num} ,Num类名输出的范围 如:"",%C{2}将使日志输出输出范围为:
%d 输出日志时间其格式为 可指定格式 如 %d{HH:mm:ss}等
%l 输出日志事件发生位置,包括类目名、发生线程,在代码中的行数
%n 换行符
%m 输出代码指定信息,如info(“message”),输出message
%p 输出日志的优先级,即 FATAL ,ERROR 等
%r 输出从启动到显示该条日志信息所耗费的时间(毫秒数)
%t 输出产生该日志事件的线程名
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3、Loggers节点,常见的有两种:Root和Logger.
Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出
Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。

logback log4j log4j2 性能实测
在这里插入图片描述
可见在同步日志模式下, Logback的性能是不佳的
而log4j2的性能无论在同步日志模式还是异步日志模式下都是最佳的