目录
1.日志门面和日志实现
门面
JCL是Apache下的commons-logging包的
实现
JUL是jdk自带,在java.util.logging包下的Logger类
Log4j是Apache下的一款开源的日志框架
Logback是由log4j创始人设计的另一个开源日志组件,性能比log4j要好
Log4j 2是对Log4j的升级版,参考了logback的一些优秀的设计
Log4j2主要有以下特色
性能提升:Log4j 2包含基于LMAX Disruptor库的下一代异步记录器。在多线程方案中,与Log4j 1.x和Logback相比,异步Logger的吞吐量高18倍,延迟降低了几个数量级
自动重载配置:与Logback一样,Log4j 2可以在修改后自动重新加载其配置。与Logback不同,它在进行重新配置时不会丢失日志事件
无垃圾机制:在稳态日志记录期间,Log4j 2 在独立应用程序中是无垃圾的,而在Web应用程序中是低垃圾的。这样可以减少垃圾收集器上的压力,并可以提供更好的响应时间性能
2.SpringBoot默认日志框架
由下图可知SpringBoot默认使用Slf4j+Logback的方式;
并且 SpringBoot 给 JDKLogging , Log4j2、Log4j , Logback 都提供了默认配置,并且如果使用了 Starters ,那么默认使用 Logback
3.形形色色的日志框架SpringBoot如何整合的
下面我们来想一个问题:假如其他框架不是使用的Slf4j门面,那么是SpringBoot是如何统一使用Slf4j进行输出的呢?
下面我们来看Slf4j官方的一张历史遗留问题的图片,网址为Log4j Bridge
可以明显看出,我们可以使用替换包对框架自带的日志门面进行替换,替换的原则清继续往下看
下
替换的原则
1、将系统中其他日志框架先排除出去;
2、用中间包来替换原有的日志框架;
3、导入slf4j其他的实现
4.更换SpringBoot默认的日志框架
比如将SpringBoot的日志实现切换为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>
复制代码
5.注意事项
阿里巴巴编码规范中建议使用Slf4j的api
6.日志级别
默认级别就是INFO
从低到高:TRACE , DEBUG , INFO , WARN , ERROR , FATAL ,OFF
项目上生产环境时候一定得把debug的日志级别重新调为warn或者更高,避免产生大量日志
如果将log level设置在某一个级别上,那么比此级别优先级高的log都能打印出来
7.日志配置文件参考
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!-- 彩色日志 -->
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
<property name="FILE_LOG_PATTERN" value="%-12(%d{yyyy-MM-dd HH:mm:ss.SSS}) |-%-5level [%thread] %c [%L] -| %msg%n" />
<!-- 控制台彩色日志输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${user.dir}/logs/btmpool.log</File><!--不指定会出现Linux无法输出文件-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${user.dir}/logs/pool.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>20MB</MaxFileSize>
</triggeringPolicy>
</appender>
<logger name="io.bytom.pool" level="DEBUG"/>
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</configuration>
复制代码
8.使用
1.使用日志工厂获取Logger
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HealthController{
//注意Logger和LoggerFactory都是导入Slf4j
private static final Logger logger= LoggerFactory.getLogger(HealthController.class);
}
复制代码
2.使用lombok
1.导入lombok依赖
2.加入@slf4j注解
3.直接使用log
后续还会继续补充日志配置文件等相关知识,请持续关注,感觉观看~