Spring Boot Logback配置日志过程解析

作者:pdai 时间:2022-12-09 18:08:06 

这篇文章主要介绍了Spring Boot Logback配置日志过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

出于性能等原因,Logback 目前是springboot应用日志的标配; 当然有时候在生产环境中也会考虑和三方中间件采用统一处理方式。

配置时考虑点

  • 支持日志路径,日志level等配置

  • 日志控制配置通过application.yml下发

  • 按天生成日志,当天的日志>50MB回滚

  • 最多保存10天日志

  • 生成的日志中Pattern自定义

  • Pattern中添加用户自定义的MDC字段,比如用户信息(当前日志是由哪个用户的请求产生),request信息。此种方式可以通过AOP切面控制,在MDC中添加requestID,在spring-logback.xml中配置Pattern。

  • 根据不同的运行环境设置Profile - dev,test,product

  • 对控制台,Err和全量日志分别配置

  • 对第三方包路径日志控制

实现范例

如下两个例子基本包含了上述的考虑点:

综合范例

application.yml


logging:
level:
 root: debug
path: C:/data/logs/springboot-logback-demo
server:
port: 8080
spring:
application:
 name: springboot-logback-demo
debug: false

Spring-logback.xml


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

<!-- 日志根目录-->
 <springProperty scope="context" name="LOG_HOME" source="logging.path" defaultValue="/data/logs/springboot-logback-demo"/>

<!-- 日志级别 -->
 <springProperty scope="context" name="LOG_ROOT_LEVEL" source="logging.level.root" defaultValue="DEBUG"/>

<!-- 标识这个"STDOUT" 将会添加到这个logger -->
 <springProperty scope="context" name="STDOUT" source="log.stdout" defaultValue="STDOUT"/>

<!-- 日志文件名称-->
 <property name="LOG_PREFIX" value="spring-boot-logback" />

<!-- 日志文件编码-->
 <property name="LOG_CHARSET" value="UTF-8" />

<!-- 日志文件路径+日期-->
 <property name="LOG_DIR" value="${LOG_HOME}/%d{yyyyMMdd}" />

<!--对日志进行格式化-->
 <property name="LOG_MSG" value="- | [%X{requestUUID}] | [%d{yyyyMMdd HH:mm:ss.SSS}] | [%level] | [${HOSTNAME}] | [%thread] | [%logger{36}] | --> %msg|%n "/>

<!--文件大小,默认10MB-->
 <property name="MAX_FILE_SIZE" value="50MB" />

<!-- 配置日志的滚动时间 ,表示只保留最近 10 天的日志-->
 <property name="MAX_HISTORY" value="10"/>

<!--输出到控制台-->
 <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
   <!-- 输出的日志内容格式化-->
   <layout class="ch.qos.logback.classic.PatternLayout">
     <pattern>${LOG_MSG}</pattern>
   </layout>
 </appender>

<!--输出到文件-->
 <appender name="0" class="ch.qos.logback.core.rolling.RollingFileAppender">
 </appender>

<!-- 定义 ALL 日志的输出方式:-->
 <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
   <!--日志文件路径,日志文件名称-->
   <File>${LOG_HOME}/all_${LOG_PREFIX}.log</File>

<!-- 设置滚动策略,当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB -->
   <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

<!--日志文件路径,新的 ALL 日志文件名称,“ i ” 是个变量 -->
     <FileNamePattern>${LOG_DIR}/all_${LOG_PREFIX}%i.log</FileNamePattern>

<!-- 配置日志的滚动时间 ,表示只保留最近 10 天的日志-->
     <MaxHistory>${MAX_HISTORY}</MaxHistory>

<!--当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB-->
     <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
       <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
     </timeBasedFileNamingAndTriggeringPolicy>

</rollingPolicy>

<!-- 输出的日志内容格式化-->
   <layout class="ch.qos.logback.classic.PatternLayout">
     <pattern>${LOG_MSG}</pattern>
   </layout>
 </appender>

<!-- 定义 ERROR 日志的输出方式:-->
 <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
   <!-- 下面为配置只输出error级别的日志 -->
   <filter class="ch.qos.logback.classic.filter.LevelFilter">
     <level>ERROR</level>
     <OnMismatch>DENY</OnMismatch>
     <OnMatch>ACCEPT</OnMatch>
   </filter>
   <!--日志文件路径,日志文件名称-->
   <File>${LOG_HOME}/err_${LOG_PREFIX}.log</File>

<!-- 设置滚动策略,当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB -->
   <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

<!--日志文件路径,新的 ERR 日志文件名称,“ i ” 是个变量 -->
     <FileNamePattern>${LOG_DIR}/err_${LOG_PREFIX}%i.log</FileNamePattern>

<!-- 配置日志的滚动时间 ,表示只保留最近 10 天的日志-->
     <MaxHistory>${MAX_HISTORY}</MaxHistory>

<!--当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB-->
     <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
       <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
     </timeBasedFileNamingAndTriggeringPolicy>
   </rollingPolicy>

<!-- 输出的日志内容格式化-->
   <layout class="ch.qos.logback.classic.PatternLayout">
     <Pattern>${LOG_MSG}</Pattern>
   </layout>
 </appender>

<!-- additivity 设为false,则logger内容不附加至root ,配置以配置包下的所有类的日志的打印,级别是 ERROR-->
 <logger name="org.springframework"   level="ERROR" />
 <logger name="org.apache.commons"   level="ERROR" />
 <logger name="org.apache.zookeeper"  level="ERROR" />
 <logger name="com.alibaba.dubbo.monitor" level="ERROR"/>
 <logger name="com.alibaba.dubbo.remoting" level="ERROR" />

<!-- ${LOG_ROOT_LEVEL} 日志级别 -->
 <root level="${LOG_ROOT_LEVEL}">

<!-- 标识这个"${STDOUT}"将会添加到这个logger -->
   <appender-ref ref="${STDOUT}"/>

<!-- FILE_ALL 日志输出添加到 logger -->
   <appender-ref ref="FILE_ALL"/>

<!-- FILE_ERROR 日志输出添加到 logger -->
   <appender-ref ref="FILE_ERROR"/>
 </root>

</configuration>

Profile 相关的配置可以参考:


<?xml version="1.0" encoding="UTF-8"?>
<configuration>
 <include resource="org/springframework/boot/logging/logback/base.xml" />

<!-- roll by day -->
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">  
   <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
     <fileNamePattern>logs/springboot-logback-demo.%d{yyyy-MM-dd}.log</fileNamePattern>  
     <maxHistory>30</maxHistory>
   </rollingPolicy>  
   <encoder>  
     <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg%n</pattern>  
   </encoder>
 </appender>

<!-- dev -->
 <logger name="org.springframework.web" level="INFO"/>
   <root level="INFO">
   <appender-ref ref="FILE" />
 </root>

<!-- test or production -->
 <springProfile name="test,prod">
   <logger name="org.springframework.web" level="INFO"/>
   <logger name="com.pdai.springboot" level="INFO"/>
   <root level="INFO">
     <appender-ref ref="FILE" />
   </root>
 </springProfile>
</configuration>

參考文档

Logback官网

https://logback.qos.ch/manual/layouts.html#conversionWord

Logback官网 文档

https://logback.qos.ch/manual/index.html

Logback中Encoder Pattern


<encoder>
 <pattern>%d{HH:mm:ss} [%thread][%X{traceId}] %-5level %logger{36} - %msg%n</pattern>
</encoder>

https://logback.qos.ch/manual/layouts.html#conversionWord

代码示例

@See  https://github.com/realpdai/springboot-logback-demo

来源:https://www.cnblogs.com/pengdai/p/11764216.html

标签:spring,boot,logback,配置,日志
0
投稿

猜你喜欢

  • Java中去除字符串中所有空格的几种方法

    2023-11-24 04:59:24
  • SpringCloud分布式链路追踪组件Sleuth配置详解

    2023-11-28 23:58:42
  • mybatis-generator自动生成dao、mapping、bean配置操作

    2023-08-17 14:05:30
  • DUCC配置平台实现一个动态化线程池示例代码

    2023-11-28 12:07:39
  • Java算法比赛常用方法实例总结

    2023-11-28 07:15:26
  • Java实现LeetCode(54.螺旋矩阵)

    2023-01-26 20:54:00
  • 详解Java的回调机制

    2023-07-27 07:17:43
  • 解决RedisTemplate调用increment报错问题

    2023-11-20 06:35:05
  • JavaFX实现UI美观效果代码实例

    2021-08-27 21:02:15
  • 详解Spring框架下向异步线程传递HttpServletRequest参数的坑

    2021-05-31 04:45:21
  • 详解SpringBoot注册Windows服务和启动报错的原因

    2022-12-28 17:10:09
  • Java泛型的简单实例

    2023-11-27 01:03:38
  • SpringBoot日志框架之Log4j2快速入门与参数详解

    2023-11-15 21:17:59
  • java web服务器实现跨域访问

    2023-09-17 06:55:08
  • 深入理解Java高级特性——注解

    2021-05-23 20:28:54
  • SVN报错:Error Updating changes:svn:E155037的解决方案

    2023-06-11 07:27:11
  • 多线程如何解决for循环效率的问题

    2023-12-02 08:31:55
  • hibernate 命名查询如何实现

    2023-11-04 02:35:41
  • maven <repositories>标签和<pluginRepositories>标签的使用

    2022-09-26 01:06:33
  • Java中BigDecimal的舍入模式解析(RoundingMode)

    2021-10-16 15:28:16
  • asp之家 软件编程 m.aspxhome.com