阅读 209

Java日志框架和Springboot日志框架

目录

1.日志门面和日志实现

2.SpringBoot默认日志框架

3.形形色色的日志框架SpringBoot如何整合的

4.更换SpringBoot默认的日志框架

5.注意事项


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

后续还会继续补充日志配置文件等相关知识,请持续关注,感觉观看~

文章分类
开发工具
文章标签