Spring Boot异步输出Logback日志方法详解

 更新时间:2019年08月25日 09:27:20   作者:风尘博客  
这篇文章主要给大家介绍了关于Spring Boot异步输出Logback日志的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

一、介绍

1.1 Logback

Logback是由log4j创始人设计的另一个开源日志组件,它分为下面下个模块:

  • logback-core:其它两个模块的基础模块
  • logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging
  • logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能

1.2 日志级别

包括:TRACE、DEBUG、INFO、WARN 和 ERROR。

1.2.1 TRACE

特别详细的系统运行完成信息,业务代码中,不要使用。(除非有特殊用意,否则请使用DEBUG级别替代)

1.2.2 DEBUG

  • 可以填写所有的想知道的相关信息(但不代表可以随便写,debug信息要有意义,最好有相关参数);
  • 生产环境需要关闭DEBUG信息
  • 如果在生产情况下需要开启DEBUG,需要使用开关进行管理,不能一直开启。

1.2.3 INFO

系统运行信息

  • Service方法中对于系统/业务状态的变更;
  • 主要逻辑中的分步骤。

外部接口部分

  • 客户端请求参数(REST/WS);
  • 调用第三方时的调用参数和调用结果。

说明

  1. 并不是所有的service都进行出入口打点记录,单一、简单service是没有意义的;
  2. 对于复杂的业务逻辑,需要进行日志打点,以及埋点记录,比如电商系统中的下订单逻辑,以及OrderAction操作(业务状态变更);
  3. 对于整个系统的提供出的接口(REST/WS),使用INFO记录入参;
  4. 如果所有的service为SOA架构,那么可以看成是一个外部接口提供方,那么必须记录入参;
  5. 调用其他第三方服务时,所有的出参和入参是必须要记录的(因为你很难追溯第三方模块发生的问题)。

1.2.4 WARN

  • 不应该出现但是不影响程序、当前请求正常运行的异常情况:
    • 有容错机制的时候出现的错误情况;
    • 找不到配置文件,但是系统能自动创建配置文件;
  • 即将接近临界值的时候,例如:缓存池占用达到警告线;
  • 业务异常的记录,比如:当接口抛出业务异常时,应该记录此异常。

1.2.5 ERROR
影响到程序正常运行、当前请求正常运行的异常情况:

  • 打开配置文件失败;
  • 所有第三方对接的异常(包括第三方返回错误码);
  • 所有影响功能使用的异常,包括:SQLException和除了业务异常之外的所有异常(RuntimeException和Exception)。

不应该出现的情况:
如果进行了抛出异常操作,请不要记录ERROR日志,由最终处理方进行处理:

反例(不要这么做):

try{
 ....
}catch(Exception ex){
 String errorMessage=String.format("Error while reading information of user [%s]",userName);
 logger.error(errorMessage,ex);
 throw new UserServiceException(errorMessage,ex);
}

1.3 SpringBoot 中 logback

  1. SpringBoot工程自带logback和slf4j的依赖,所以重点放在编写配置文件上,需要引入什么依赖,日志依赖冲突统统都不需要我们管了;
  2. logback框架会默认加载classpath下命名为logback-spring或logback的配置文件。
  3. 将所有日志都存储在一个文件中文件大小也随着应用的运行越来越大并且不好排查问题,正确的做法应该是将ERROR日志和其他日志分开,并且不同级别的日志根据时间段进行记录存储。

二、logback 配置

2.1 配置文件logback-spring.xml示例

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <!-- 属性文件:在配置文件中找到对应的配置项 -->
  <springProperty scope="context" name="logPath" source="logging.path"/>

  <!-- 输出到控制台 -->
  <appender name="CONSOLE-LOG" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
      <pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
    </layout>
  </appender>

  <!-- 获取比info级别高(包括info级别)但除error级别的日志 -->
  <appender name="INFO-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!-- 指定过滤策略 -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>ERROR</level>
      <onMatch>DENY</onMatch>
      <onMismatch>ACCEPT</onMismatch>
    </filter>
    <encoder>
      <!-- 指定日志输出格式 -->
      <pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
    </encoder>

    <!-- 指定收集策略:滚动策略-->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- 指定生成日志保存地址 -->
      <fileNamePattern>${logPath}/info.%d.log</fileNamePattern>
      <maxHistory>30</maxHistory>
    </rollingPolicy>
  </appender>

  <appender name="ERROR-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!-- 指定过滤策略 -->
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>ERROR</level>
    </filter>
    <encoder>
      <!-- 指定日志输出格式 -->
      <pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
    </encoder>
    <!-- 指定收集策略:滚动策略-->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!--指定生成日志保存地址 -->
      <fileNamePattern>${logPath}/error.%d.log</fileNamePattern>
      <maxHistory>30</maxHistory>
    </rollingPolicy>
  </appender>

  <!-- 异步输出 -->
  <appender name="ASYNC-INFO" class="ch.qos.logback.classic.AsyncAppender">
    <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
    <discardingThreshold>0</discardingThreshold>
    <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
    <queueSize>256</queueSize>
    <!-- 添加附加的appender,最多只能添加一个 -->
    <appender-ref ref="INFO-LOG"/>
  </appender>

  <appender name="ASYNC-ERROR" class="ch.qos.logback.classic.AsyncAppender">
    <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
    <discardingThreshold>0</discardingThreshold>
    <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
    <queueSize>256</queueSize>
    <!-- 添加附加的appender,最多只能添加一个 -->
    <appender-ref ref="ERROR-LOG"/>
  </appender>

  <!-- 指定最基础的日志输出级别 -->
  <root level="info">
    <appender-ref ref="CONSOLE-LOG" />
    <appender-ref ref="INFO-LOG" />
    <appender-ref ref="ERROR-LOG" />
  </root>

</configuration>

项目配置文件中配置日志输出地址

logging:
 path: ./logs
  

2.2 标签说明

  • <root>标签:指定最基础的日志输出级别;
    • <appender-ref>标签,添加append
  • <appender>标签:指定日志的收集策略
    • name属性指定appender命名
    • class属性指定输出策略,通常有两种,控制台输出和文件输出,文件输出就是将日志进行一个持久化。ConsoleAppender将日志输出到控制台。
  • <filter>标签:指定过滤策略
    • <level>:指定过滤的类型。
  • <encoder>标签:使用该标签下的<pattern>标签指定日志输出格式。
  • <rollingPolicy>标签:指定收集策略,比如基于时间进行收集
    • 标签指定生成日志保存地址,实现了按天分类以及日志的目标了。

三、 源码

Github 示例源码

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

相关文章

  • java实现简单的英文文本单词翻译器功能示例

    java实现简单的英文文本单词翻译器功能示例

    这篇文章主要介绍了java实现简单的英文文本单词翻译器功能,涉及java文件读取、字符串分割、遍历、判断等相关操作技巧,需要的朋友可以参考下
    2017-10-10
  • SpringBoot中的ApplicationListener事件监听器使用详解

    SpringBoot中的ApplicationListener事件监听器使用详解

    这篇文章主要介绍了SpringBoot中的ApplicationListener事件监听器使用详解,ApplicationListener是应用程序的事件监听器,继承自java.util.EventListener标准接口,采用观察者设计模式,需要的朋友可以参考下
    2023-11-11
  • Java对int[]数组做新增删除去重操作代码

    Java对int[]数组做新增删除去重操作代码

    这篇文章主要介绍了Java里面对int[]数组做新增删除去重实现,这里记录下使用int[]数组对数组进行新增删除去重等操作,用来更加了解java里面的集合类思想,需要的朋友可以参考下
    2023-10-10
  • Java split方法使用超详细讲解

    Java split方法使用超详细讲解

    这篇文章主要给大家介绍了关于Java split方法使用的相关资料,Java中的我们可以利用split把字符串按照指定的分割符进行分割,然后返回字符串数组,需要的朋友可以参考下
    2023-10-10
  • 5分钟快速上手Spring Boot

    5分钟快速上手Spring Boot

    这篇文章主要介绍了5分钟快速上手Spring Boot,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Java并发编程之栅栏(CyclicBarrier)实例介绍

    Java并发编程之栅栏(CyclicBarrier)实例介绍

    这篇文章主要介绍了Java并发编程之栅栏(CyclicBarrier)实例介绍,栅栏类似闭锁,但是它们是有区别的,需要的朋友可以参考下
    2015-04-04
  • SpringBoot项目使用slf4j的MDC日志打点功能(最新推荐)

    SpringBoot项目使用slf4j的MDC日志打点功能(最新推荐)

    这篇文章主要介绍了SpringBoot项目使用slf4j的MDC日志打点功能,本文通过示例代码给大家介绍非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • 使用BeanFactory实现创建对象

    使用BeanFactory实现创建对象

    这篇文章主要为大家详细介绍了使用BeanFactory实现创建对象,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • java多态实现电子宠物系统

    java多态实现电子宠物系统

    这篇文章主要为大家详细介绍了java多态实现电子宠物系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • JAVA中 Spring定时器的两种实现方式

    JAVA中 Spring定时器的两种实现方式

    本文向您介绍Spring定时器的两种实现方式,包括Java Timer定时和Quartz定时器,两种Spring定时器的实现方式各有优点,可结合具体项目考虑是否采用。
    2015-09-09

最新评论