Spring Boot如何打印日志
数据库驱动工作原理
我们在项目开发中,都需要连接到数据库;代码如下
导入mysql驱动
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
编写连接数据库代码
分析,什么叫“门面”
我们发现左侧一般都是jdk提供的结构,右侧是数据库厂商实现的类;这个是jdk常用的手段,你mysql厂商想接入java可以,我这里有一套接口,你实现以下,如何去连接你的数据库,如何发送一条sql到数据库执行,事务如何提交等等;对于Oracle想要接入java也是一样,也得实现java.sql下的一套规范;我们也可以称jdk提供的这套接口为门面
日志框架工作原理
系统提供门面,我们自己选择一个具体的实现
打开我们最常用的日志门面网站
进入手册页面
这里有一段示例代码
SLF4J有哪些实现
上一个页面继续往下拉,可以看到下图;以后使用Slf4j做日志实现不熟悉导包可以参考这个图
- 下图的6列表示SLF4J可以选用5种实现(第一列没有实现、最后一列表示不输出日志)
- 第一行,说明可以整合哪些日志实现
- 第二行,蓝色中有个灰色框这里说明需要导入的jar包slf4j-api,这个使我们的slf4j门面接口
- 第三行,表示我们使用不同的日志实现需要导入的jar包,这一层可能是适配层,适配不直接支持的日志框架实现
- 第四行,没有提供直接支持的情况,比如log4j.jar
实例代码分析
package com.qs;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import java.sql.Connection;
import java.sql.DriverManager;
@Component
public class DBConnection {
//构建日志对象
Logger logger = LoggerFactory.getLogger(DBConnection.class);
@Bean
public Connection getConn(){
try {
Class.forName("com.mysql.jdbc.Driver");
return DriverManager.getConnection("jdbc:mysql:///mysql", "root", "1234567890");
}catch (Exception e){
//使用日志对象打印error级别的日志,{}是占位符,e.getMessage()的内容填充{}
logger.error("数据库连接错误:{}",e.getMessage());
}finally {
//使用日志对象打印info级别的错误
logger.info("数据库连接成功!");
}
return null;
}
}
输出结果
这是默认的输出样式,是可以进行配置的
error级别的日志没有打印是因为现在没有连接数据库失败,是不是很智能
startle
我们并没有导入日志的实现,但是有输出;和我上面说的还要导包是不是有偏差;这是因为springboot默认选择了logback作为门面的实现,jar包都倒好了的原因
实际开发会遇到的问题
问题
日志是个好东西,大家都会使用到这个;那这样就会有问题了,我们开发项目可能会导入如下的这些框架
- 问题:a框架用commons-logging,b框架用jboss-logging,c框架有其他的;那这样不就很乱了嘛;既然是一样项目,我们更希望项目中的日志输出是统一的样式;第一:好看,第二:后期收集日志分析更容易
如何解决呢?
进到leagcy APIs找一张图
解决思路:
官方提供了很多图,这里选择其中一张说明,这张图说明的问题是:
一个系统中用到了4个框架,然而这四个框架中包含四种日志实现;
1、logback
2、commons-logging
3、log4j
4、java.util.logging
那么此时就是我们就会出现日志不统一的情况,怎么办呢?
-
比如我们想统一使用logback来做实现,
- (1)把commons-logging的jar包替换成jcl-over-slf4j.jar
- (2)把log4j的jar包替换成log4j-over-slf4j.jar
- (3)导入juc-to-slf4j.jar的jar包
-
大家学过maven的话,只需要在pom文件的dependence标签中使用exclusive字标签排除相应的jar包,添加新的jar包就可以解决问题。
SpringBoot采用的日志
门面是谁
slf4j 全称(Simple Logging Facade For Java)
选择的实现是谁
logback
Spring Boot 日志架构方式
【1】在pom文件中右键,选择下图菜单
【2】按住control放大,找到如下内容
这张图看的不是很清楚的话看下一张图
【2】另一种查看依赖的方式
在开发中导入了其它框架,不同的日志实现怎么办
- 1.x版本 需要排除就的日志包
- 2.x版本 啥都不用管
总结:这也是springboot一直发布新版本的原因,功能原来越NB;这种麻烦的事情spring boot都帮我们考虑进去了。