写一个统一的接口层;日志门面(日志的一个抽象层);logging-abstract.jar;
给项目中导入具体的日志实现就行;我们之前的日志框架都是实现的抽象层;
常用的日志框架:JUL,JCL,Jboss-logging,Logback,Log4j2 ,Log4j,SLF4J
日志抽象层 | 日志实现 |
---|---|
JCL(Jakarta Commons Logging) SLF4j(Simple Logging Facade for Java) jboss-logging | Log4j JUL(java.util.logging) Log4j2 Logback |
左边选抽象,右边选实现
SLF4J + Logback
Spring Boot的底层是Spring框架,而Spring默认框架是JCL;
SpringBoot选用SLF4J和logback
以后开发的时候,日志记录方法的调用,不应该来直接调用日志的实现类,而是调用日志抽象层里面的方法;
应该给系统里面导入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以后,配置文件还是做成日志实现框架本身的配置文件
如果存在一个a系统(slf4j+logback):Spring(commons-logging)、Hibernate(jboss-logging)、Mybatis
如何统一日志框架slf4j?
将系统中其他日志框架排除出去
用中间包来替换原有的日志框架
导入slf4j的其他实现
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
SpringBoot使用日志功能:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency>
底层依赖关系:
总结:
- SpringBoot底层也是使用slf4j+logback
- SpringBoot也把其他日志替换成了slf4j
- 中间转换包(如图例)
- 如果要引入其他框架?一定要把这个框架的日志依赖移除掉,而且底层
spring框架用的是commons-logging
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency>
SpringBoot能自动适配所有的日志,他的底层使用slf4j+logback的方式记录日志,引入其他框架的时候,只需要把这个框架依赖的日志框架排除掉
SpringBoot默认帮我们配置好了日志
//记录器 Logger logger = LoggerFactory.getLogger(getClass()); @Test public void contextLoads() { //日志的级别由低到高 //可以调整输出的日志级别;日志就只会在这个级别以后的高级别生效 logger.trace("trace日志。。"); logger.debug("debug日志。。"); //SpringBoot默认给的是info级别,如果没指定就是springboot默认的root级别 logger.info("info日志。。。"); logger.warn("warn日志。。。"); logger.error("error日志。。"); }
指定某个包的日志级别logging.level.com.miao=trace
#当前项目下生成springboot.log的文件记录日志,也可以指定位置logging.file=D:/springboot.log logging.file=springboot.log #当前磁盘下根路径创建spring文件中log文件夹,使用spring.log作为默认 #logging.path=/spring/log #控制台输出的日志格式 日期 + 线程号 + 靠左 级别 +全类名50字符限制+消息+换行 logging.pattern.console=%d{yyyy-MM-dd } [%thread] %-5level %logger{50} - %msg%n #指定文件中日志输出的格式 logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} === [%thread] === %-5level %logger{50} - %msg%n
日志输出格式:
#控制台输出的日志格式 #%d:日期 #%thread:线程号 #%-5level:靠左 级别 #%logger{50}:全类名50字符限制,否则按照句号分割 #%msg:消息+换行 #%n:换行 logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
SpringBoot关于logging的官方文档
给类路径下放上每个日志框架自己的配置框架;SpringBoot就不会使用自己默认的配置
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解析日志配置,可以使用springboot的高级springProfile功能
<springProfile name="staging"> <!-- configuration to be enabled when the "staging" profile is active --> </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>
可以根据slf4j的日志适配图,进行相关切换
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> </exclusions> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </dependency>
slf4j+log4j2的方式
<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>