日志想必各位都不陌生了,虽然我们平时的学习当中只看看这个控制台的日志,但是其他方式也要去掌握哦。这次就来讲讲这个日志与spring boot摩擦的火花。一些简单的使用。
基本介绍
我们首先来看看这个市面上常用的一些框架:
JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j....
相信各位可能之前学习spring用到过一个就是log4j,当然,框架嘛。都是类似的,而且这个东西对我们来说,能够使用起来也就差不多了。
对上面这个谢东先简单的分类:
日志门面 (日志的抽象层) | 日志实现 |
JCL(Jakarta Commons Logging)SLF4j(Simple Logging Facade for Java) jboss-loggi | JUL(java.util.logging) Log4j和Log4j2Logback |
怎么来理解这个东西,我们之前学习过JDBC吧,还记得JDBC和数据库驱动是什么关系吗?对的,就是和这个是一样的思想。因为各个厂商可能有不同的想法,所以出来的东西可能出现很大的不同,这样学习成本就会非常的高。于是总有那么牛逼的团队能够去定义一些规范,于是就有了这个东西。
现在再来理解这个上面的东西:
左边我们理解为JDBC,也就是规范。右边就是我们使用的对应的规范的实现。
然后我们使用就是左边选择一个规范,右边用一个实现。例:SLF4j-->Logback
我们的spring boot默认的一套组合就是这个SLF4J和logback。
了解了上面的基本介绍,接下来就来看看这个东西怎么使用。
基本的使用
首先我们是不需要去导入什么东西的,因为这就是spring boot默认的组合,自然你能用到它的场景,都会给你导入这个东西。
如何在系统中使用SLF4j :https://www.slf4j.org,这个是官网,有兴趣的可以查看。
一个简单的使用:
class SpringBoot2ApplicationTests { //记录器 Logger logger = LoggerFactory.getLogger(getClass()); @Test void contextLoads() { //日志的级别,按这个顺序由低到高 //也就是如果调整日志级别,比这个级别低的信息不会输出 logger.trace("trace...."); logger.debug("debug...."); //springboot的默认级别为root,也就是info logger.info("info...."); logger.warn("warn...."); logger.error("error...."); }}
这个就会输出相应的信息,类似system.out.println,但是这个输出是会按照这个级别输出的。
比如我们可以调节输出的级别为debug,这样就可以显示这个级别以及这个级别更高的信息。例如:logging.level.com.sheep=trace(意思是这个包下的所有日志信息级别为trace)
当然,虽然我们的spring boot默认是这个,但是当我们利用spring boot整合其他的框架的时候,别的框架可不一定使用的是这个,但是我们在整个工程不可能使用多个相同功能框架来做同一件事,所以就需要统一这个工程的框架。怎么做呢?
当项目是使用多种日志API时,可以统一适配到SLF4J,
中间使用SLF4J或者第三方提供的日志适配器适配到SLF4J,SLF4J在底层用开发者想用的一个日志框架来进行日志系统的实现,从而达到了多种日志的统一实现。
还好这个抽象层为不同的框架也出了一些适配的包,可以将这个不同的包转换成我们可以使用的包。
什么意思呢,相当于虽然使用的框架不同,但是为了使得统一最后的结果,我们在使用这个的时候,会引入一个中间转换包。这个转换包的作用就是把这个框架的效果转换成我们目标框架的效果。
使用的步骤:
- 将系统中的其他日志框架先排除出去
- 用中间包来替换原有的包 (适配器的类名和包名与替换的被日志框架一致)
- 再导入其他的实现包
SpringBoot也把其他的日志都替换成了slf4j(这个伟大的spring boot已经处理了这个事情)
SpringBoot能自动适配所有的日志,而且底层使用slf4j+logback的方式记录日志,引入其他框架的时候,只需要把这个框架依赖的日志框架排除掉即可。(有没有再一次被spring boot感动到)
例如我们使用这个原生的spring,我们需要做的就是排除这个框架自动依赖的日志框架:
<dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-coreartifactId> <exclusions> <exclusion> <groupId>commons-logginggroupId> <artifactId>commons-loggingartifactId> exclusion> exclusions>dependency>
再来看看这个日志怎么配置使用,怎么自己规范输出的格式这个:
前面我们简单的看了这个基本的输出使用,那怎么去调整这个输出的格式呢:
日志输出格式:
例如:
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n%d表示日期时间,%thread表示线程名,%-5level:级别从左显示5个字符宽度%logger{50} 表示logger名字最长50个字符,否则按照句点分割。%msg:日志消息,%n是换行符。 %msg:日志消息,%n是换行符
修改spring boot的默认配置:
logging.level.com.sheep=trace#yaml格式如下:logging: level: com: sheep: trace # 我们可以指定日志输出到文件中这个就是指定输出的日志文件名,默认会在当前项目下生成日志文件,也可以指定位置#logging.file.name=springboot.log# 指定输出的位置,文件名字默认生成#logging.file.path=D:/test# 指定日志输出的格式#这个是在控制台输出的格式logging.pattern.console=%d{yyyy/MM/dd} [%thread] %-5level %logger- %msg%n#这个使在文件中的输出格式logging.pattern.file=%d{yyyy/MM/dd} [%thread] %-5level %logger- %msg%n
上面的基本操作应该是差不多都会了吧,接下来看点高级的操作:
高级操作
我们使用一些基本的配置也是可以满足我们学习过程的使用,但是我们怎么可以止步于此。来看看这个xml配置文件的高级配置:
给类路径下放上每个日志框架自己的配置文件即可,SpringBoot就不使用他默认配置的了。
Logback | logback-spring.xml, logback-spring.groovy, logback.xml or logback.groovy |
Log4j2 | log4j2-spring.xml or log4j2.xml |
JDK (Java Util Logging) | logging.properties |
注意:这些名字都是规定好的,我们不能更改。
当然我们也注意到这个
文件的名字有的有好几个,
命名不同
功能也不同哦。例如:
logback.xml:直接就被日志框架识别了;
logback-spring.xml:日志框架就不直接加载日志的配置项,由SpringBoot解析日志配置,可以使用SpringBoot的高级Profile功能
"staging">
springProfile>
<?xml version="1.0" encoding="UTF-8"?>
spring-boot-logging
INFO
ACCEPT
DENY
%d{HH:mm:ss.SSS} ======== %contextName [%thread] %-5level %logger{36} - %msg%n
${log.path}/spring-boot-logging.log
${log.path}/spring-boot-logging.%d{yyyy-MM-dd}.log.zip
30
1GB
%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n
如果使用logback.xml作为日志配置文件,还要使用profile功能,会有以下错误
no applicable action for [springProfile]
如果更多使用操作可以自行百度哦。
有帮助的朋友可以点赞,或者推荐给你的小伙伴。