SpringBoot日志

SpringBoot日志

七月 17, 2019

日志

引言:

  1. 开发时将关键数据打印在控制台,为了更好的展示便有了一些记录框架

  2. 框架记录运行时信息;日志框架xxxlogging.jar;

  3. 进一步的有了几个功能,异步,自动归档…..;xxxlogging-good.jar

  4. 新的项目需要兼容,换上新的框架,修改之前的API;xxxlogging-perfect.jar

  5. 模仿JDBC-数据库驱动的原理

    写一个统一的接口层;日志门面(日志的一个抽象层);logging-abstract.jar;给项目中导入具体的日志实现就行;我们之前的日志框架都是实现抽象层;

市面上的日志框架

JUL,JCL,Jboss-logging,log back,log4j…..

日志门面(日志的抽象层) 日志实现
JCL(Jakarta Commons Logging),SLF4j(Simple Logging Facade for Java),jboss-logging Log4j,JUL,Log4j2,Logback

左边选择一个接口,右边选择一个实现;

日志门面:SLF4j;

日志实现:Logback

SpringBoot:底层用的Spring框架,默认使用JCL;==SpringBoot选用SLF4j和Logback==

使用

关于SLF4j

开发时,日志记录方法的调用,不应该直接调用日志实现类,而是调用日志抽象层里面的方法;

给系统里面导入slf4j和logback的实现jar

1
2
3
4
5
6
7
8
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");
}
}

ZqL0Vs.png

每一个日志的实现框架都有自己的配置文件,使用SLF4j时,配置文件还是做成日志实现框架的配置文件;

问题

假设系统a中用的(SLF4j+logback),Spring(Commons-logging),Hibernate(jboss-ligging)…..

统一使用日志记录,别的框架也用SLF4j进行输出

ZqOmiq.png

如何让系统中所有日志都统一到slf4j;

  1. 将系统中的其他日志框架排除出去

  2. 用中间包替换原有的日志框架

  3. 导入slf4j其他的实现

1
2
3
4
5
6
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.1.6.RELEASE</version>
<scope>compile</scope>
</dependency>

SpringBoot使用它来做日志功能

1
2
3
4
5
6
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<version>2.1.6.RELEASE</version>
<scope>compile</scope>
</dependency>

总结:

  1. SpringBoot底层也是用slf4j——logback的方式进行日志记录
  2. SpringBoot也把其他的日志都替换成了slf4j
  3. 中间替换包
  4. 引入了其他框架,一定要把默认日志依赖移除

==SpringBoot能自动适配所有日志,引入其他框架时,只需要把框架依赖的日志框架移除就行==

日志的使用

SpringBoot已经默认帮我们配好了日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//记录器
Logger logger = LoggerFactory.getLogger(getClass());
@Test
public void contextLoads() {

//日志级别
//由低到高
//可以调整输出日志级别
logger.trace("这是trace日志");
logger.debug("这是debug日志");

//默认使用info级别的
logger.info("这是info日志");
logger.warn("这是warn日志");
logger.error("这是error日志");
}
1
2
3
4
5
6
7
8
9
10
11
#修改输出日志级别
logging.level.com.example=trace


#默认在当前项目下输出指定文件,可加指定路径
#logging.file=/spring/log指的是在根目录下创建spring文件夹和里面的log文件夹,默认使用spring.log作为文件
logging.file=springboot.log
#在控制台输出的日志格式
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
#指定文件中日志输出格式
logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} === %msg%n

具体格式可参照如下:

参数 说明
%p 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出日志信息所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%l 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
%x 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%% 输出一个”%”字符
%F 输出日志消息产生时所在的文件名称
%L 输出代码中的行号
%m 输出代码中指定的消息,产生的日志具体信息
%n 输出一个回车换行符,Windows平台为”\r\n”,Unix平台为”\n”输出日志信息换行
%20c 指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
%-20c 指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,”-”号指定左对齐。
%.30c 指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
%20.30c 如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。

日志切換

slf4j切换成log4j2

先将原来的slf4j的依赖包排除,再导入log4j2依赖,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>