三、日志
1、日志框架
Spring Boot选用了SLF4j和 logback组合,SLF4j作为抽象层,logback作为实现层
2、 SLF4j使用
1、如何在系统使用SLF4j
对于日志记录方法的调用,应该调用日志抽象层里面的方法,而不是直接调用日志的实现类
系统首先导入slf4j的jar和 logback的实现jar
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以后,配置文件还是用日志实现类自己本身的配置文件
2、遗留问题
系统a(slf4j + logback) : Spring(commons-logging)、hibernate(jboss-logging).....
统一日志记录,即使是用了其他框架都用slf4j进行输出
如何让系统中的所有框架的日志都统一到slf4j:
-
将系统中其他的日志框架先排除
-
用中间包来替换原有的日志框架
-
再用slf4j其他的实现
3、Spring Boot日志关系
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Spring Boot使用它来做日志功能:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<version>2.3.5.RELEASE</version>
<scope>compile</scope>
</dependency>
底层依赖关系:
总结:
-
SpringBoot底层也是使用了slf4j+logback的方式进行日志记录
-
SpringBoot也把其他的日志替换成slf4j
-
中间包替换
-
排除掉原来日志框架的依赖,spring里面没有commons-logging的依赖,用jcl替代了
SpringBoot能自动适配所有的日志,而且底层使用了slf4j+logback的日志记录方式,引入其他框架也自动转为这种记录方式
4、日志使用
1、默认配置
SpringBoot默认已经配置过了
@SpringBootTest
class SpringBoot03LoggingApplicationTests {
// 记录器
Logger logger = LoggerFactory.getLogger(getClass());
@Test
void contextLoads() {
// 日志的级别
// 由低到高 trace<debug<info<warn<error
// 可以调整需要输出的日志级别,日志只会在本级别以上的进行输出
logger.trace("这是trace日志。。。");
logger.debug("这是debug日志。。。");
// springBoot默认提供的info级别,root级别
logger.info("这是info日志");
logger.warn("这是warn日志");
logger.error("这是error日志");
}
}
也可以更改级别,在全局配置文件中,也有其他的设置配置:
# 指定日志输出等级
logging.level.com.wiggin=trace
# 不指定路径在当前root目录下创建log日志
# 可以指定路径
#logging.file.name=G:/springboot.log
# 在当前磁盘下根目录下创建spring文件夹,再创建log文件夹,默认创建的文件名为spring.log
logging.file.path=/spring/log
# 指定控制台输出的格式
logging.pattern.console= %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n
# 指定文件中输出的格式
logging.pattern.file= %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n
logback日志配置示例
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- 日志输出编码 -->
<Encoding>UTF-8</Encoding>
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,
%thread表示线程名,
%-5level:级别从左显示5个字符宽度
%msg:日志消息,%n是换行符 -->
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n
</pattern>
</layout>
</appender>
2、指定配置
给类路径下放上各种日志框架的配置文件,原来的spring boot日志配置文件就失效了:
Logging System | Customization |
---|---|
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识别,这样就可以使用特定功能
<springProfile name="staging">
<!-- configuration to be enabled when the "staging" profile is active -->
<!--配置在staging环境下能够被执行-->
</springProfile>
<springProfile name="dev | staging">
<!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</springProfile>
<springProfile name="!production">
<!-- configuration to be enabled when the "production" profile is not active -->
</springProfile>
例如上面的logback日志在logback-spring.xml的配置下就能这样书写:
<layout class="ch.qos.logback.classic.PatternLayout">
<springProfile name="dev">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}->[%thread] %-5level %logger{50} - %msg%n</pattern>
</springProfile>
<springProfile name="!dev">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}=>[%thread] %-5level %logger{50} - %msg%n</pattern>
</springProfile>
</layout>
5、切换日志框架
可以在pom文件下生成关系图,通过去除其他的框架与slf4j的关系,并且引入log4j的替换包,来完成日志框架的替换:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>logback-classic</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
<exclusion>
<artifactId>logback-classic</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.3.2.RELEASE</version>
</dependency>