SpringBoot异步输出Logback⽇志⽅法详解
⼀、介绍
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);
<(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 配置⽂件l⽰例
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<!-- 属性⽂件:在配置⽂件中到对应的配置项 -->
<springProperty scope="context" name="logPath" source="logging.path"/>
<!-- 输出到控制台 -->
<appender name="CONSOLE-LOG" class="ch.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.olling.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.olling.TimeBasedRollingPolicy">
<!-- 指定⽣成⽇志保存地址 -->
<fileNamePattern>${logPath}/info.%d.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<appender name="ERROR-LOG" class="ch.olling.RollingFileAppender">
<!-- 指定过滤策略 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
springboot切换log4j2<encoder>
<!-- 指定⽇志输出格式 -->
<pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
</encoder>
<!-- 指定收集策略:滚动策略-->
<rollingPolicy class="ch.olling.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>标签:指定收集策略,⽐如基于时间进⾏收集
标签指定⽣成⽇志保存地址,实现了按天分类以及⽇志的⽬标了。
三、源码
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,谢谢⼤家对的⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论