3.18
目录
1.日志
2.SLFS4j的使用
实现
遗留问题
3.springboot日志关系
4.springboot默认配置
1.日志
日志门面(日志的抽象层) | 日志实现 |
JCL(jakarta Commons Logging)SLF4j(Simple Logging Facade for Java) jboss-logging |
Log4j JUL(iava.util.logging) Log4j2 Logback |
左边选一个门面(抽象层),右边选择一个来实现
springboot:底层是spring框架,spring框架默认是JCL;springboot选用SFL4j和logback。
2.SLF4j的使用
以后开发,日志记录方法的调用不应该直接调用日志的实现类,而是调用日志抽象层里面的方法;给系统里面导入slf4j的jar和logback的实现jar
http://www.slf4j.org/manual.html
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class HelloWorld { public static void main(String[] args) { Logger logger = LoggerFactory.getLogger(HelloWorld.class); logger.info("Hello World"); } }
slf4j的实现:
1.应用里只导了SLF4J的jar,进行日志的记录和调用,会输出到一个空的位置,因为没有任何实现。
2.应用里导入slf4j-api.jar和logback的jar包 调用slf4j的接口,用logback来实现。
3.应用里导入slf4j-api.jar、slf4j-log412.jar、log4j.jar
由于log4j出现的早于slf4j,设计时没考虑到slf4j的存在。为了让log4j也能符合slf4j的规范,需要中间的适配层slf4j-log412.jar。
适配层实现抽象层slf4j的具体方法,在适配层的方法里进行真正日志记录的时候调用log4j。
每一个日志的实现框架都有自己的配置文件。使用slf4j以后,配置文件还是做成日志实现框架的自己本身的配置文件。
比如:用log4j的来做日志实现,就写log4j的配置文件;用logback来做日志实现,就写logback的配置文件。
遗留问题:项目中有 slf4j+logback、Spring(commons-logging)、Hibernate(jboss-logging)、Mybatis··· ···
目的:统一日志记录,即使是别的框架也统一使用slf4j进行输出。
方法:1.将系统中其他日志框架先排除出去,用中间包替换原有的日志框架
用jcl-over-slf4j.jar替换commons-logging.jar
用log4j-over-slf4j.jar替换log4j.jar
用jul-to-slf4j.jar替换java.util.logging API
2.导入slf4j其他的实现
3.springboot日志关系
springboot用它来使用日志功能
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency>
打开pom.xml 左键
可以看到2.0版本的springboot底层依赖关系:
使用logback记录日志,把 jul-to-slf4j log4j-to-slf4j 日志框架转为slf4j
通过spring-jcl 将commons-logging 转换为slf4j
总结:
1.springboot底层也是使用slf4j+logback的方式进行日志记录
2.springboot也把其他的日志都替换成了slf4j
如果要引入其他框架,一定要把默认日志框架移除
spring框架用的是commons-logging,springboot能自动适配所有日志,而且底层使用slf4j+logback记录日志,引入其他框架只需要将这个框架引入的日志文件排除。
在1.x版本的springboot中可以看到:spring-core.pom已把commons-logging排除
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.3.20.RELEASE</version> <exclusions> <exclusion> <artifactId>commons-logging</artifactId> <groupId>commons-logging</groupId> </exclusion> </exclusions> </dependency>
在2.0版本的springboot,转换器直接写到了jcl原本包里,jcl就是用slf4j
spring-core.pom
<dependencies> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-to-slf4j</artifactId> <version>2.10.0</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jul-to-slf4j</artifactId> <version>1.7.25</version> <scope>compile</scope> </dependency> </dependencies>
4.springboot默认配置
1.按springboot的默认配置输出日志
@Test public void text(){ //日志的级别 由低到高trace<debug<info<warn<error //可以调整输出的日志级别,日志就只会在这个级别以后的高级级别生效 //springboot默认使用的是info级别的,所以只会输出info及以后的内容,也称root级别 logger.trace("trace"); logger.debug("debug"); logger.info("info"); logger.warn("warn"); logger.error("error"); }
输出:
2020-03-18 19:09:47.607 INFO 18038 --- [ main] com.example.demo.DemoApplicationTests : info
2020-03-18 19:09:47.607 WARN 18038 --- [ main] com.example.demo.DemoApplicationTests : warn
2020-03-18 19:09:47.607 ERROR 18038 --- [ main] com.example.demo.DemoApplicationTests : error
更改默认配置:
在application.properties中加入,将springboot的日志默认级别改为trace,则trace及级别大于trace的内容都可以输出
logging.level.com=trace
输出:
2020-03-18 21:02:44.968 TRACE 21636 --- [ main] com.example.demo.DemoApplicationTests : trace 2020-03-18 21:02:44.968 DEBUG 21636 --- [ main] com.example.demo.DemoApplicationTests : debug 2020-03-18 21:02:44.968 INFO 21636 --- [ main] com.example.demo.DemoApplicationTests : info 2020-03-18 21:02:44.969 WARN 21636 --- [ main] com.example.demo.DemoApplicationTests : warn 2020-03-18 21:02:44.969 ERROR 21636 --- [ main] com.example.demo.DemoApplicationTests : error
建立springboot.log文档,在application.properties中加入:
#不指定路径在当前项目下生成spring.log,也可以指定完整路径 #2.2版本 生成日志 logging.file.path=/Users/mac/Desktop/springboot.log #2.0版本可以用 2.2版本已过时 logging.file=springboot.log
springboot对于日志的默认配置可以看源码:org.springframework.boot.logging.logback
2.指定配置
给类路径下放上每个日志框架自己的配置文件(相关规则见官网)即可,springboot就不使用默认配置了