微前端架构如何改变企业的开发模式与效率提升
1199
2022-11-05
SpringBoot3集成SLF4J+logback进行日志记录的实现
目录1 快速实现2 配置xml2.1 configuration2.2 property和springProperty2.3 root2.4 appender2.4.1 ConsoleAppender2.4.2 FileAppender2.4.3 RollingFileAppender2.5 logger3 更多情形3.1 日志级别3.2 日志滚动3.2.1 时间策略3.2.2 文件大小策略3.2.3 时间与文件大小策略3.3 日志过滤3.3.1 LevelFilter3.3.2 ThresholdFilter3.3.3 EvaluatorFilter3.4 与配置文件结合
SpringBoot会默认使用logback作为日志框架,在生成springboot项目的时候可以直接勾选logback,那么就可以直接使用logback了。手动添加的话,建议使用slf4j+logback,后面项目更容易维护:
SLF4J 是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。大概意思是指你只需要按统一的方式写记录日志的代码,而无需关心日志是通过哪个日志系统,以什么风格输出的,因为它们取决于部署项目时绑定的日志系统。例如,在项目中使用了 SLF4J 记录日志,并且绑定了 Log4j(即导入相应的依赖),则日志会以 Log4j 的风格输出;后期需要改为以 Logback 的风格输出日志,只需要将 Log4j 替换成 Logback 即可,不用修改项目中的代码。
1 快速实现
假如我们需要实现这么一个需求:在文件中记录调用接口事件和传参,并在控制台显示。实现起来很简单,三步即可。
第一步,在resource目录下创建一个logback.xml文件,内部写入:
关于这段xml的详情,第二章节会详细讲解
第二步,在application.yml文件中配置项目要使用的日志配置文件路径:
logging:
config: classpath:logback.xml
第三步,在接口添加日志记录:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
// getLogger()的入参是当前类,否则输出日志的类名会是错误的
private final Logger logger = LoggerFactory.getLogger(TestController.class);
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String logTest(String name, String age) {
logger.info("logTest,name:{},age:{}", name, age);
return "success";
}
}
当然,如果你安装了lombok这个插件,就更简单了: Lombok使用详解
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j
public class TestController {
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String logTest(String name, String age) {
log.info("logTest,name:{},age:{}", name, age);
return "success";
}
}
启动项目后调用接口,控制台输出如我们所期望:
同时,项目中增加了一个log目录,生成mutest.log文件,里面记录了日志:
功能是实现了,但我们脑子里还是有很多小问号,不急,接下来就细细讲来。
2 配置xml
首先,在resource目录下创建一个文件,命名为logback.xml。现在先向里面写一些固定的内容,就是下面这个样子:
2.2 property和springProperty
这两个节点可以设置全局变量。
property可以直接设置,例如:
这样就设置了一个名为logFile的变量,后续通过${logFile}的方式就引用到了其值logs/mutest。
而springProperty则要配合配置文件,例如:
也是设置了一个名为logFile的变量,但没有直接赋值,而是通过source指向了配置文件的路径,配置文件中是这样的:
log:
file: logs/mutest
2.3 root
root节点,必选节点,用来指定最基础的日志输出级别并指定
一个典型的root节点如下:
2.4 appender
appender节点是非常关键的一个节点,负责格式化一个日志输出节点(也就是描述日志存储类型、位置、滚动规则等属性)。我个人理解,appender作用类似于构造一个日志模板,而logger是真正的日志输出者,使用某个appender作为模板去写日志。
appender有三种类型,分别是ConsoleAppender(控制台日志)、FileAppender(文件日志)、RollingFileAppender(滚动文件日志)。
2.4.1 ConsoleAppender
ConsoleAppender的作用是将日志输出到控制台,一般在本地调试时使用,它的配置非常简单,一个典型的ConsoleAppender如下:
appender 有name和class两个属性:
name:appender节点的名称,在后文中被logger节点引用。一个logback配置文件中不能有重复的appender name。class:使用何种日志输出策略,分别是ConsoleAppender(控制台日志)、FileAppender(文件日志)、RollingFileAppender(滚动文件日志)。
2.4.2 FileAppender
FileAppender用于把日志添加到文件。一个典型的FileAppender如下:
<append>true
相对于ConsoleAppender,它多了一些子节点,让我们一一来看:
pattern定义了日志的输出格式,我们以
%date:表示日期%thread:表示线程名%-5level:表示级别从左显示 5 个字符宽度%logger{50}:表示 Logger 名字最长 50 个字符%msg:表示日志消息%n:换行符
2.4.3 RollingFileAppender
RollingFileAppender用于滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。一个典型的RollingFileAppender节点如下:
另外,RollingFileAppender节点下有一些常用的子节点:
还有几个属性,要根据滚动策略去添加:
2.5 logger
logger节点,可选节点,作用是指明具体的包或类的日志输出级别,以及要使用的
一个典型的logger节点如下:
name:必写属性,指定具体包或类,被指定的包或类中的日志输出将遵从该logger规定配置。level:非必写属性,指定日志输出级别,该级别将覆盖root配置的输出级别。addtivity:非必写属性,是否向上级loger传递打印信息。默认是true。appender-ref:引用的appender,引用后将实现appender中定义的行为,例如上面示例中引用了fileLog这个appender,那么com.mutest.demo中打印的日志将按fileLog的配置进行记录。一个logger可以有多个引用,互不影响。
3 更多情形
3.1 日志级别
logback有5种级别,分别是TRACE < DEBUG < INFO < WARN < ERROR,定义于ch.qos.logback.classic.Level类中。
Trace:是追踪,就是程序推进一下,你就可以写个trace输出,所以trace应该会特别多,一般不会设置到这个级别。Debug:指出细粒度信息事件对调试应用程序是非常有帮助的。Info:消息在粗粒度级别上突出强调应用程序的运行过程。Warn:输出警告及warn以上级别的日志。Error:输出错误信息日志.
此外OFF表示关闭全部日志,ALL表示开启全部日志。
那么,在logback中,日志级别如何设置呢?
首先,
其次,logger中可以设置日志级别,设置后将覆盖
另外,还可以在配置文件中设置更加具体的日志级别,例如将com.mutest.controller包下所有的日志输出级别设置为info,那么即使logger中,设置为error级别,日志仍然输出。
logging:
config: classpath:logback.xml
level:
com.mutest.controller: info
3.2 日志滚动
如果不设置日志滚动策略,那么会一直向一个文件中追加日志,日志文件会越来越大,想要查找有用信息会很慢,而且有占满磁盘的风险。所以,我们要设置滚动策略,即满足一定条件,生成一个新文件,而旧日志文件进行归档。
3.2.1 时间策略
以时间周期为切分条件,
fileNamePattern:必要节点,包含文件名及“%d”转换符,“%d”可以包含一个java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM}。如果直接使用 %d,默认格式是 yyyy-MM-dd。maxHistory:日志最大保存的日期。比如如果你设置的pattern是按天算的,那么设置maxHistory为30,那么会自动删除30天之前的日志。totalSizeCap:日志最大保存的大小。当超过该值,会自动删除老的日志文件。必须和maxHistory一起使用,而且maxHistory先生效,其次是判断是否达到totalSizeCap。cleanHistoryOnStart:默认false。如果设置为true,再项目启动的时候会自动删除老的日志文件。
3.2.2 文件大小策略
以文件大小为切分条件,
要注意的是,
3.2.3 时间与文件大小策略
根据日志文件大小和时间周期作为切分条件,满足其中任意一个就要做切分。
同样,
3.3 日志过滤
首先,了解一下,日志级别从低到高分为:
TRACE < DEBUG < INFO < WARN < ERROR < FATAL
有时候,我们需要对日志进行过滤,logback提供了多种过滤规则的实现。
3.3.1 LevelFilter
比如说,日志级别为info以上,但我们不想打印warn类型的日志,那么按照下面的配置做:
几个参数的含义:
ch.qos.logback.classic.filter.LevelFilter:过滤规则。这里是根据日志级别进行匹配。level:要匹配的日志级别。
3.3.2 ThresholdFilter
除了 ch.qos.logback.classic.filter.LevelFilter外,还有一种过滤策略:ThresholdFilter。即临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。
比如,设置只打印info级别以上的日志:
3.3.3 EvaluatorFilter
EvaluatorFilter是求值过滤器,评估、鉴别日志是否符合指定条件。
属性释义:
3.4 与配置文件结合
Spring Boot项目的配置文件有 application.properties 文件和 application.yml 文件两种,而我个人比较喜欢用 yml 文件。
application.yml 文件中对日志的配置:
logging:
config: logback.xml
level:
com.example.demo.dao: trace
logging.config 用来指定项目启动的时候,读取哪个配置文件,这里指定的日志配置文件是根路径下的 logback.xml 文件。关于日志的相关配置信息,都放在了 logback.xml 文件中。logging.level 用来指定具体的 Mapper 中日志的输出级别,上面的配置表示 com.example.demo.dao 包下的所有 Mapper 日志输出级别为 Trace,会将操作数据库的 SQL 打印出来。开发时设置成 trace 方便定位问题,在生产环境上,将这个日志级别再设置成 error 级别即可。常用的日志级别按照从高到低依次为:ERROR、WARN、INFO、DEBUG。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~