NO.1 Spring Boot干货系列:(七)默认日志logback配置解析 【作者:嘟嘟MD】
NO.2 Java日志框架SLF4J和log4j以及logback的联系和区别
NO.3 SLF4J和Logback和Log4j和Logging的区别与联系
3.1 日志接口框架
常见日志接口框架有两个:
日志接口框架只提供了供用户调用的接口,并没有给出具体实现
3.2 日志实现框架
3.3 日志接口框架和日志实现框架
其中,log4j和JUL(java.util.logging)因为没有直接实现slf4j接口框架,所以需要相应的适配器(slf4j-log12、slf4j-jdk14)来将slf4j接口框架和其进行绑定。而logback、slf4j-simple、slf4j-nop直接实现了slf4j接口框架,所以不需要适配器。
3.4 推荐使用 “日志接口框架+日志实现框架”
在使用日志时,可以不配合日志接口框架而直接使用日志实现框架,但是并不建议这样使用。
假设项目中已经使用了log4j,而我们此时加载了一个类库,而这个类库依赖另一个日志实现框架。这个时候我们就需要维护两个日志实现框架,这是一个非常麻烦的事情。但是如果配合使用slf4j就不同了,由于应用调用的是日志接口方法,与底层日志实现是无关的,因此可以任意更换具体的日志实现框架。
日志级别从低到高分别是
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
级别简单介绍
大多数日志框架推荐常用的级别是,DEBUG、INFO、WARN、ERROR。
如果将log level设置在某一个级别上,那么比此级别优先级高的log都会打印出来,比此级别优先级低的log都不会打印出来。
如何将日志加入到项目中?下面以在 springboot 项目中引入 logback 日志为例。
5.1 默认情况下
Spring框架使用的是Jakarta Commons Logging API (JCL)。
Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台(即,日志默认级别为INFO)。
5.2 日志信息介绍
5.3 引入日志依赖
在 springboot 项目中,只要添加了 spring-boot-starter-logging 依赖,则应用将自动使用 logback 作为应用日志框架。
通过查看依赖可知,spring-boot-starter 已经包含了 spring-boot-starter-logging。而 spring-boot-start-web、mybatis-spring-boot-starter、spring-booter-start-jdbc 等都包含了 spring-boot-starter-logging,所以并不需要直接依赖 spring-boot-starter-logging。
5.4 在 application.properties 配置文件配置日志
假设项目所在目录为 D:\Projects\Test。
该属性用来指定日志文件路径和文件名(路径可以是绝对路径,也可以是相对路径)。
logging.file=logs\\my.log
# 如果配置的是相对路径,则会在项目根目录生成指定日志文件
# D:\Projects\Test\logs\my.log
##############
logging.file=E:\\logs\\my.log
# 如果配置的是绝对路径,则生成指定日志文件
# E:\logs\my.log
# 如果logs目录不存在,则会自动创建该目录。
# 如果该目录下已存在同名文件,则会在原文件后继续追加当前日志内容。
该属性用来指定日志文件路径,在指定路径下生成默认日志文件 spring.log(只能指定目录,不能指定文件名)。
logging.path=E:\\logs
# E:\logs\spring.log
# 如果logs目录不存在,则会自动创建该目录。
# 如果该目录下已存在spring.log,则会在原文件后继续追加当前日志内容。
5.5 logback.xml 与 logback-spring.xml
> logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
> log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml
> log4j2:log4j2-spring.xml, log4j2.xml
> JUL(java util logging):logging.properties
logging.config=classpath:logging-dev.xml
5.6 logback-spring.xml 配置文件示例
logback
debug
${CONSOLE_LOG_PATTERN}
UTF-8
${logPath}/info.log
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
UTF-8
${logPath}/info-%d{yyyy-MM-dd}.%i.log
100MB
30
5GB
info
ACCEPT
DENY
5.7 配置文件解析
5.7.1
配置文件的根节点
5.7.2
上下文名称
logback
每个 logger 都关联到 logger 上下文,默认上下文名称为 “default”。可以设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改,可以通过 %contextName 来打印日志上下文名称。
5.7.3
定义变量
5.7.4
输出策略及其他配置
debug
${CONSOLE_LOG_PATTERN}
UTF-8
${logPath}/info.log
${logPath}/info_%d{yyyy-MM-dd}.%i.txt
100MB
60
5GB
%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n
解析
debug
%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n
UTF-8
可以直接指定日志格式,日志格式解析如下:
示例
也可以设置彩色日志格式,但彩色日志格式要引入渲染类的依赖:
${CONSOLE_LOG_PATTERN}
UTF-8
示例
彩色日志格式建议只用于控制台日志输出,因为如果在文件日志输出中采用彩色日志,会出现乱码。
${logPath}/info.log
E:/logs/info.log
指定日志文件位置,在文件输出策略中进行该配置。
${logPath}/info_%d{yyyy-MM-dd}.%i.txt
100MB
60
5GB
日志记录器的滚动策略。随着应用的运行时间越来越长,日志也会增长的越来越多,将他们输出到同一个文件并不合理。
示例
5.7.5
root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性。
5.7.6
用来设置某一个包或者具体的某一个类的日志打印级别。
5.7.7
据不同环境(profile)来定义不同的日志输出。
因为前面说过,要使用 spring 配置文件中的变量值(例如:当前环境变量profile),需要定义日志文件名为 logback-spring.xml 而不是 logback.xml。所以,要使用这个配置,需要定义日志文件名为 logback-spring.xml。
5.8 使用日志
方式一(LoggerFactory):
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Test{
private static final Logger log = LoggerFactory.getLogger(Test.class);
public void test(){
log.trace("===================trace=============");
log.debug("===================debug=============");
log.info("===================info=============");
log.warn("===================warn=============");
log.error("===================error=============");
}
}
方式二(使用lombox注解):
引入lomobx 的 maven依赖
org.projectlombok
lombok
1.16.10
使用注解
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class Test{
public void test(){
log.trace("===================trace=============");
log.debug("===================debug=============");
log.info("===================info=============");
log.warn("===================warn=============");
log.error("===================error=============");
}
}