日志系统分为两部分,一部分是日志抽象层,一部分是日志实现层。常见的日志抽象层JCL,SLF4J,JBoss-Logging,日志实现层有logback,log4j,log4j2,JUL。日志抽象层的功能是提供一个统一的调用入口,而真正得日志实现功能有日志实现层来做。如果需要使用日志功能,则需要选取一个日志抽象层和一个日志实现层。
slf4j 是一个日志抽象层框架,他需要和其他日志实现框架配合才能实现日志功能,如下图所示,如果单独使用slf4j则会输出空,slf4j和logback配合使用的话,还需导入logback相关的jar包,如果和其他的日志实现框架配合使用的话,不仅需要导入日志实现框架还需要导入一个转换层,如log4j 的slf4-log4j12.jar。不管使用哪种日志实现框架,日志的配置文件还是需要使用日志实现框架的配置文件,这个文件是被日志框架直接读取的。
1.SLF4J的使用
2.如何统一使用slf4j 记录日志
由于系统导入很多依赖,每个依赖可能已经在依赖其他的的日志框架(如spring 依赖 Commons logging),如何让他们统一使用slf4j记录日志呢?sjf4j 的官方文档 中https://www.slf4j.org/legacy.html 有介绍
如上图,具体做法是:
(1)将框架已经依赖的其他日志框架先排除掉
(2)导入中间的适配层jar包(jul-to-slf4j.jar等等)
(3)再导入需要的日志实现jar包。
3.spring boot 的日志实现
Spring boot 底层的日志实现是通过slf4j + logback实现的。下图是spring boot 的依赖关系,spring-boot-starter-logging是spring boot 的日志启动器。它又分别依赖了logback-classic 和 log4j-to-slf4j,jul-to-slf4j ,这两个jar包的作用就是上面讲的,讲其他的日志框架转换成slf4j,作为一个中间适配层来使用的。
spring boot 会为我们自动适配成slf4j + logback 的日志记录框架,如果需要引入其他额外的jar包,怎么能让新引入的jar也使用上slf4j+logback 来记录日志呢?
只需要做一件就够了:如果新引入的jar包中含有其他日志框架,我们只要将这个日志框架从jar包中排除即可。spring boot 已经导入相应的适配层的包,会自动顶替被排除包的功能。例如 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>
4.spring boot 的日志使用
spring boot 已经默认配置好了日志
Logger logger = LoggerFactory.getLogger(xxx.class);
获取日志记录器,使用loger.info 、logger.debug 等方法记录日志,如果需要调整默认的日志配置,则在全局配置文件中修改配置即可,spring boot 默认的root级别为info 级别,输出info及以上级别的日志信息。同时也可以日志的输出格式。
%d表示日期时间,
%thread表示线程名,
%-5level:级别从左显示5个字符宽度
%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
%msg:日志消息,
%n是换行符
logging.file 和 logging.path 如果都不指定,则只会在控制台输出,不会在文件输出。
logging.file 可以指定生成日志文件的名称或者日志文件的名称及位置,如果不指定位置只指定了名称,在会在当前的项目路径下生成日志文件。
logging.path 指定日志文件的位置,默认使用spring.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
#指定日志文件大小,超过指定的值,则新建一个,默认10M
logging.file.max-size=20M
#要保存的存档日志文件的最大数量
logging.file.max-history=10
5.使用自定义的配置文件
官方文档的26.5章节开始介绍了使用自定义配置文件的办法。使用方法是在类路径上放日志框架的配置文件即可
官方推荐使用带-spring 的配置文件,带-sping 后缀的和不带后缀的区别是:带后缀的后被spring 识别,可以使用一些spring 的高级特性,不带后缀的只会被日志框架实现。
官方文档的26.6.1 和26.6.2介绍了两种告诫特性,分别是profile 和 Environment ,规定了再特殊条件下才可生效。
6.更改spring boot 默认的日志框架
如果不想使用spring boot 默认的日志框架,想切换成其他的日志实现框架。
1.从spring-boot-starter 中排除logback 的jar包
2.引入其他日志实现框架的jar包
切换成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>log4j-over-slf4j</artifactId> <groupId>org.slf4j</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>