3.1 日志框架分类和选择
市面上的日志框架
JCL、SLF4J,Jboss-logging、logback、log4j、log4j2、JUL ....
左边选一个门面(抽象层),右边来选一个实现 ?
注意:1. Spring框架默认使用JCL,SpringBoot选用了SLF4j 和logback2. 为什么要选择 SLF4j 和logback? ① jboss-logging 适用场景太少 ② JCL 最后一次更新为2014年 ③ log4j,Logback,SLF4J是同一个人写的,log4j写出来有性能问题于是他写 了Logback日志实现 和 SLF4J抽象层 ④ JUL为java.util自带的日志实现,不太强 ⑤ log4j2借了log4j之名,是Apache重新写的一个框架,由于设计的太好还没有 适配许多框架
3.2 SLF4J原理
如何在系统中使用SLF4j,参考官方文档:https://www.slf4j.org
以后开发的时候,日志记录方法的调用不应该来直接调用日志的实现类,而是调用日志抽象层里面的方法
使用
出现较早的日志框架需要做中间适配层
-
例如给系统里面导入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"); } }
注意:1. 每一个日志的实现框架都有自己的配置文件2. 使用SLF4J以后,配置文件还是做成日志实现框架自己本身的配置文件
3.3 其它日志框架统一转换为SLF4J
问题
假设开发A系统,用的日志框架是(slf4j+logback),但是开发A系统要依赖Spring,Hibernate,MyBatis等框架且每一个框架在底层也用到了日志框架。如Spring使用了commons-logging,Hibernate使用了jboss-logging
统一日志记录 即使是别的框架也要和我一起统一使用SLF4J进行日志输出?
将系统中其他日志框架先排除出去
用中间包来替换原有的日志框架
我们再来导入SLF4J其他的实现如Logback
3.4 SpringBoot日志关系
所有的场景启动器都依赖spring‐boot‐starter
<dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring‐boot‐starterartifactId> dependency>
spring‐boot‐starter中的依赖 spring‐boot‐starter‐logging
<dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring‐boot‐starter-loggingartifactId> dependency>
pom.xml右键Diagrams可视化SpringBoot底层依赖关系
总结
SpringBoot底层也是使用slf4j+logback的方式进行日志记录
SpringBoot也把其他的日志都替换成了slf4j;
中间替换包 ?
-
如果我们要引入其他框架,一定要把这个框架的默认日志依赖移除掉!!例如SpringBoot排除了Spring底层的commos-logging包
3.5 日志使用 - 默认配置
SpringBoot默认帮我们配置好了日志,可以直接使用
配置文件中修改日志的默认配置
3.6 日志使用 - 指定配置
给类路径下放上每个日志框架自己的配置文件即可,SpringBoot就不使用他默认配置的了
logback.xml 与 logback-spring.xml 区别
logback.xml :直接就被日志框架识别了
logback-spring.xml :日志框架就不直接加载日志的配置项,由SpringBoot解析日志配置,可以使用SpringBoot 的高级Profile功能
<springProfile name="staging"> 可以指定某段配置只在某个环境下生效 springProfile>
-
Profile功能举例:
logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?><configuration> <appender name="Console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>[%d{yyyy/MM/dd-HH:mm:ss}] [%thread] [%-5level] [%logger] : %msg%npattern> <charset>UTF-8charset> encoder> appender> <appender name="fileStore" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFOlevel> filter> <File>logs/polaris_blog_system.logFile> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logs/sob_system_blog.%d.%i.logfileNamePattern> <maxHistory>30maxHistory> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>10MBmaxFileSize> timeBasedFileNamingAndTriggeringPolicy> rollingPolicy> <encoder> <pattern>[%d{yyyy/MM/dd-HH:mm:ss}] [%thread] [%-5level] [%logger] : %msg%npattern> <charset>UTF-8charset> encoder> appender> <logger name="com.polaris.blog" level="DEBUG" additivity="false"> <appender-ref ref="Console"/> <appender-ref ref="fileStore"/> logger> <root level="INFO"> <appender-ref ref="Console"/> root>configuration>
3.7 lombok依赖
安装lombok插件,使用时添加@Slf4j注解,通过log调用即可。就不用在使用log的时候每次都创建了
当然,lombok还有很多其他强大的功能。
使用
添加依赖
<dependency> <groupId>org.projectlombokgroupId> <artifactId>lombokartifactId> <version>1.18.12version> <scope>providedscope>dependency>
-
添加IDE工具对Lombok的支持
//IDEA中引入Lombok支持如下:// ① 点击File-- Settings设置界面,安装Lombok插件:// ② 点击File-- Settings设置界面,开启 AnnocationProcessors:// 开启该项是为了让Lombok注解在编译阶段起到作用。
3.8 切换日志框架
可以按照slf4j的日志适配图,进行相关的切换
从slf4j+logback切换到slf4j+log4j的方式(不推荐,log4j有性能问题)
从slf4j+logback切换到slf4j+log4j2
可以直接把spring-boot-starter-logging替换为spring-boot-starter-log4j2