SpringBoot 使用log4j2的配置过程

作者:蜗牛学编程 时间:2021-11-09 04:15:25 

前言

日志接口(slf4j)

slf4j是对所有日志框架制定的一种规范、标准、接口,并不是一个框架的具体的实现,因为接口并不能独立使用,需要和具体的日志框架实现配合使用(如log4j、logback)。

接口用于定制规范,可以有多个实现,使用时是面向接口的(导入的包都是slf4j的包而不是具体某个日志框架中的包),即直接和接 * 互,不直接使用实现,所以可以任意的更换实现而不用更改代码中的日志相关代码。

日志实现(log4j、logback、log4j2)

Log4j:Apache的一个开源项目,可以控制日志信息输送的目的地是控制台、文件、GUI组件等,可以控制每一条日志的输出格式,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。虽然已经停止维护了,但目前绝大部分企业都是用的log4j。

LogBack:logback同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4j的一个日志框架,是slf4j的原生实现。

Log4j2:Log4j2是log4j 1.x和logback的改进版,据说采用了一些新技术(无锁异步、等等),使得日志的吞吐量、性能比log4j 1.x提高10倍,并解决了一些死锁的bug,而且配置更加简单灵活。

配置过程

springboot默认是用logback的日志框架的,所以要在pom中配置排除logback。这里需要注意的是,其实不止一处使用了logback,所以要在starter中统一排除,然后引入log4j2。

涉及的POM部分文件

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter</artifactId>
   <exclusions>
       <exclusion><!-- springboot默认是用logback的日志框架的 -->
           <groupId>org.springframework.boot</groupId>  
           <artifactId>spring-boot-starter-logging</artifactId>  
       </exclusion>  
   </exclusions>
</dependency>
<dependency> <!-- 引入log4j2依赖 -->  
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-log4j2</artifactId>  
</dependency>

log4j2配置文件,默认命名为log4j2.xml。 程序会会自动加载,如果命名为log4j2-xx.xml。需要在在SpringBoot配置文件application.properties中引入该配置文件,增加一行:logging.config=classpath:log4j2-xx.xml

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

<Configuration status="WARN" monitorInterval="1800">

<!--变量配置-->
   <Properties>
       <!--应用名称-->
       <property name="APP_NAME">sky-hello</property>
       <!--日志存放路径-->
       <property name="LOG_PATH">./logs/${APP_NAME}</property>
       <!--日志备份路径-->
       <property name="LOG_BACKUP_PATH">${LOG_PATH}/backup</property>
       <!--日志输出格式-控制台-->
       <property name="PATTERN_CONSOLE">%d{yyyy-MM-dd HH:mm:ss.SSS} | %blue{%traceId} | %highlight{%-5p} | %magenta{${sys:PID}} | %yellow{%t} | %cyan{%l} : %msg%n</property>
       <!--日志输出格式-文件-->
       <property name="PATTERN_FILE">%d{yyyy-MM-dd HH:mm:ss.SSS} | %traceId | %-5p | ${sys:PID} | %t | %l : %msg%n</property>
   </Properties>

<!--定义日志输出目的地,内容和格式等-->
   <Appenders>

<!--可归档文件
           1. fileName: 日志存储路径
           2. filePattern: 历史日志封存路径。其中%d{yyyy-MM-dd}表示了日志的时间单位是天,log4j2自动识别zip等后缀,表示历史日志需要压缩
       -->
       <RollingFile name="RollingFile" fileName="${LOG_PATH}/${APP_NAME}.log" filePattern="${LOG_BACKUP_PATH}/$${date:yyyy-MM}/${APP_NAME}-%d{yyyy-MM-dd}_%i.log.zip">
           <!--输出日志的格式, 不设置默认为:%m%n-->
           <PatternLayout pattern="${PATTERN_FILE}"/>
           <!--只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
           <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
           <!--归档设置-->
           <Policies>
               <!--按时间间隔归档:
                   1. interval=时间间隔, 单位由filePattern的%d日期格式指定, 此处配置代表每一天归档一次
                   2. modulate="true" 是否对interval取模,决定了下一次触发的时间点
               -->
               <TimeBasedTriggeringPolicy interval="1" modulate="true" />
               <!-- 按照日志文件的大小: size表示当前日志文件的最大size,支持单位:KB/MB/GB-->
               <SizeBasedTriggeringPolicy size="50MB"/>
           </Policies>
           <!-- 历史日志配置: 该属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
           <DefaultRolloverStrategy max="30"/>
       </RollingFile>

<!--错误信息单独归档-->
       <RollingFile name="RollingFileError" fileName="${LOG_PATH}/${APP_NAME}-error.log" filePattern="${LOG_BACKUP_PATH}/$${date:yyyy-MM}/${APP_NAME}-error-%d{yyyy-MM-dd}_%i.log.zip">
           <PatternLayout pattern="${PATTERN_FILE}"/>
           <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
           <Policies>
               <TimeBasedTriggeringPolicy/>
               <SizeBasedTriggeringPolicy size="50MB"/>
           </Policies>
       </RollingFile>
   </Appenders>

<!--Loggers配置-->
   <Loggers>

<!--
       注意点:
       1. logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等:
          (1). name: 用来指定该logger所适用的类或者类所在的包全路径,继承自Root节点.
          (2). AppenderRef:关联的Appender, 只有定义了logger并引入的appender,appender才会生效
          (3). additivity: logEvent的传递性。true LogEvent处理后传递给父Logger打印。false LogEvent处理后不再向上传递给父Logger(解决日志重复输出问题)
          (4). logger配置的level必须高于或等于Appenders中ThresholdFilter配置的过滤level, 否则会造成信息丢失
       2. root配置日志的根节点
       -->

<!-- 同步日志配置-->
       <logger name="com.sky.hello.mapper" level="debug" additivity="false">
           <AppenderRef ref="Console"/>
           <AppenderRef ref="RollingFile"/>
           <AppenderRef ref="RollingFileError"/>
       </logger>

<root level="info">
           <AppenderRef ref="Console"/>
           <AppenderRef ref="RollingFile"/>
           <AppenderRef ref="RollingFileError"/>
       </root>

</Loggers>

</Configuration>

代码中使用

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

private final Logger log = LoggerFactory.getLogger(this.getClass());

log.info("info")

最后附加 log4j的格式配置参数

%n - 换行

%m - 日志内容,输出代码中指定的日志信息

%p - 日志级别(FATAL,   ERROR,   WARN,   INFO,   DEBUG   or   custom)

%r - 程序启动到现在的毫秒数

%% -  输出一个"%" 字符

%t - 当前线程名

%d - 日期和时间, 常用的格式有 %d{DATE}, %d{ABSOLUTE}, %d{HH:mm:ss,SSS}, %d{ddMMyyyy HH:mm:ss,SSS}

%l - 同 %F%L%C%M

%F - java源文件名

%L - java源码行数

%C - java类名,%C{1} 输出最后一个元素

%M - java方法名

来源:https://www.cnblogs.com/snail-learn-code/p/16532637.html

标签:SpringBoot,log4j2,配置
0
投稿

猜你喜欢

  • java实现文件变化监控的方法(推荐)

    2023-11-08 01:18:26
  • 详解Android 中的文件存储

    2023-12-21 17:44:44
  • java中的JsonSerializer用法,前后端单位转换必备

    2022-05-01 07:58:48
  • java反射遍历实体类属性和类型,并赋值和获取值的简单方法

    2023-07-15 04:37:18
  • springboot+swagger2.10.5+mybatis-plus 入门详解

    2023-03-15 01:58:38
  • 自定义Spring Security的身份验证失败处理方法

    2022-09-27 13:18:31
  • 在WinForm中发送HTTP请求的实现方法

    2023-01-28 10:47:35
  • java长整除问题浅谈

    2023-05-22 06:06:23
  • c# 深拷贝与浅拷贝的区别分析及实例

    2023-06-29 05:00:06
  • Java数据结构超详细分析二叉搜索树

    2022-12-01 01:34:20
  • Java线程同步、同步方法实例详解

    2023-10-16 07:10:53
  • Spring Cloud Hystrix异常处理方法详解

    2022-05-29 06:20:12
  • Ajax实现省市区三级联动

    2023-01-14 05:09:58
  • SpringCloud Eureka应用全面介绍

    2022-08-23 17:43:26
  • Java实现经典游戏复杂迷宫

    2021-05-29 22:33:34
  • SpringBoot @Cacheable自定义KeyGenerator方式

    2022-12-25 13:23:11
  • Android开发性能优化总结

    2021-11-05 14:03:59
  • SpringCloud Gateway使用详解

    2023-11-27 02:54:36
  • 在Java的Struts中判断是否调用AJAX及用拦截 器对其优化

    2023-11-25 00:40:40
  • java并发编程_线程池的使用方法(详解)

    2023-03-29 22:23:00
  • asp之家 软件编程 m.aspxhome.com