Spring Boot Logback配置日志过程解析

 更新时间:2019年10月30日 14:19:55   作者:pdai  
这篇文章主要介绍了Spring Boot Logback配置日志过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java实现限定时间CountDownLatch并行场景

    Java实现限定时间CountDownLatch并行场景

    本文将结合实例代码,介绍Java实现限定时间CountDownLatch并行场景,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • Mybatis-plus支持Gbase8s分页的实现示例

    Mybatis-plus支持Gbase8s分页的实现示例

    本文主要介绍了Mybatis-plus支持Gbase8s分页的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • java编程ThreadLocal上下传递源码解析

    java编程ThreadLocal上下传递源码解析

    这篇文章主要为大家介绍了java编程中ThreadLocal提供的上下传递方式的源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • spring boot 与kafka集成的示例代码

    spring boot 与kafka集成的示例代码

    这篇文章主要介绍了spring boot 与kafka集成的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • spring注解 @PropertySource配置数据源全流程

    spring注解 @PropertySource配置数据源全流程

    这篇文章主要介绍了spring注解 @PropertySource配置数据源全流程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java递归求和1+2+3+...+n实例详解

    Java递归求和1+2+3+...+n实例详解

    在本篇文章里小编给大家带来了关于Java递归求和1+2+3+...+n实例内容,需要的朋友们可以学习参考下。
    2020-01-01
  • Java 数据结构与算法系列精讲之汉诺塔

    Java 数据结构与算法系列精讲之汉诺塔

    汉诺塔是源于印度一个古老传说的益智玩具。大梵天创造世界时做了三根石柱,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,三根柱子之间一次只能移动一个圆盘
    2022-02-02
  • SpringBoot Security使用MySQL实现验证与权限管理

    SpringBoot Security使用MySQL实现验证与权限管理

    安全管理是软件系统必不可少的的功能。根据经典的“墨菲定律”——凡是可能,总会发生。如果系统存在安全隐患,最终必然会出现问题,这篇文章主要介绍了SpringBoot安全管理Spring Security基本配置
    2022-11-11
  • 详解SpringBoot注入数据的方式

    详解SpringBoot注入数据的方式

    这篇文章主要介绍了详解SpringBoot注入数据的方式,详细的介绍了几种注入方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • java基础之泛型知识点总结

    java基础之泛型知识点总结

    这篇文章主要介绍了java基础之泛型知识点总结,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有很好的帮助,需要的朋友可以参考下
    2021-04-04

最新评论