开发经验SpringBoot日志SLF4j+Logback日志模块化
Posted 叁滴水
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开发经验SpringBoot日志SLF4j+Logback日志模块化相关的知识,希望对你有一定的参考价值。
如果你看到我这个文章,想必肯定是受到了生产环境查日志的折磨了吧。在生产环境中没有ELK这种日志查询工具时,通过日志的模块化,区分文件,可以更加快速的定位到日志信息。例如:订单日志,请求日志、响应日志、服务间互相调用日志等等。
1、当前类的日志单独保存在一个文件中
如:orderService的日志要单独保存。
@Service
@Slf4j(topic = "order")
public class OrderServiceImpl{
}
在注解中设置topic
为order
;并且在logback.xml
中新增logger
标签,设置日志级别为info
(日志级别自行设置)。
<logger name="order" level="info">
<appender-ref ref="api-order"/>
</logger>
设置其打印位置appender
。appender-ref
中的ref
的值要和appender
的name
属性一致。
<appender name="order" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/order.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天回滚 -->
<fileNamePattern>${log.path}/%d{yyyy-MM-dd}/order.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史7天 -->
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
如上设置说明,当天的日志打印在order.log
中,历史的日志按天进行保存,最多保存7天的日志。日志的打印格式为log.pattern
(为日志的打印格式,网上很多,自行设置即可)
2、特定的日志在特定的文件中
假如想记录整个订单的全部过程,在一个类打印是不行的,因为这个订单的逻辑可能写在多个类中。因此,需要打印多个地方。打印方式如下:
private Logger orderlog = LoggerFactory.getLogger("order");
通过 LoggerFactory.getLogger
方法创建日志对象。传入order
表示是一个订单专用打印日志对象。在订单的必要步骤,如创建订单、订单修改等步骤可通过这种方式进行日志打印。
在logback.xml
添加logger
。其name
也同样要为order
。通过appender-ref
设置日志打印的位置。与上门appender
配置一样,自行配置即可。
<logger name="order" level="info">
<appender-ref ref="order"/>
</logger>
3.按照模块打印
订单模块、商品模块、用户模块等按照固定的包名进行日志打印。那订单模块为例,新增一个logger
,其name
为order
的包的路径,另外新增appender-ref
设置其打印路径即可。当name
的值为类路径时,表名将此类的日志提取出来。
<logger name="com.order.service" level="info">
<appender-ref ref="order"/>
</logger>
总结
所有的提取都是围绕与logger标签。其name可以为topic名称、普通名称、包名、类名。
- topic名称由注解@Slf4j(topic = “order”)设置。
- 普通名称由LoggerFactory.getLogger(“order”)设置。
- 包名和类名在logger标签设置即可。
每个logger标签都可以设置自己的日志基本,一般自己的业务系统的日志级别为info。如果是引用其他的框架的日志级别一般为warn。logback有5种级别,分别是TRACE < DEBUG < INFO < WARN < ERROR
单独提取到文件的日志默认情况下会与root
标签的日志重复。 也就是说logger
标签会默认继承与root
标签。如果想日志不重复可以设置additivity
为false
。
<logger name="order" level="info" additivity="false"/>
以上是关于开发经验SpringBoot日志SLF4j+Logback日志模块化的主要内容,如果未能解决你的问题,请参考以下文章