你还在为怎么记录日志发愁吗?试试这个框架

编码时经常会需要打印日志,有的同学通常会想使用System.out.println打印日志就可以了。当然这也是一个方案,但是使用这种方式打印日志有以下几种弊端:

  1. 日志无法保存到文件,只能在屏幕上看,之前的日志查询不到
  2. 在大的并发下面这种方式打印日志是非常耗费io性能的
  3. 无法区分日志的级别,生产环境通常只需要打印警告或者错误的日志

基于以上问题,那我们日志打印有什么好的解决方案吗?本期就为你揭秘,spring的log日志框架通常有如下几种:

  1. Logback Spring Boot 约定的默认配置
  2. log4j
  3. log4j2
  4. slf4j
  5. JUL

本期,我们讲的是slf4j这个框架

新建工程,添加如下依赖:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

在工程中使用注解的形式将日志插件引入进来,如下:

@Slf4j
@RestController
public class DemoController {

    @GetMapping("get")
    public void test(){
        log.trace("trace log");
        log.debug("debug log");
        log.info("info log");
        log.warn("warn log");
        log.error("error log");
    }
}

log日志共有以下几个级别(日志级别从低到高):

  1. TRACE
  2. DEBUG
  3. INFO
  4. WARN
  5. ERROR
2021-01-23 14:18:32.246  INFO 1356 --- [nio-8080-exec-4] c.e.lesson17.controller.DemoController   : info log
2021-01-23 14:18:32.248  WARN 1356 --- [nio-8080-exec-4] c.e.lesson17.controller.DemoController   : warn log
2021-01-23 14:18:32.248 ERROR 1356 --- [nio-8080-exec-4] c.e.lesson17.controller.DemoController   : error log

请求一次,看到后台只打印出来了info级别的日志,那就是说默认打印的日志级别是info级别,但是如果我们需要调整日志打印级别怎么办呢?

application.yml里面调整日志打印的级别:

logging:
  level:
    root: trace

重新请求一次,是不是trace的日志也打印出来了?但是好像多了很多跟我们无关的日志,我只想打印自己代码中的日志可以吗》当然可以,调整配置如下:

logging:
  level:
    com.example: trace

这样就只打印com.example下的日志了。之前配置的rootspring的全局包配置,意思是所有包下的日志打印级别都是trace。当然你可以在logging.level下配置多个不同包的不同日志打印级别。

log日志还支持占位符

String param="springboot 课程";
log.info("请求参数:{},结果:{}",param,"hello slf4j");

控制台打印:

2021-01-23 14:29:55.430  INFO 25460 --- [nio-8080-exec-8] c.e.lesson17.controller.DemoController   : 请求参数:springboot 课程,结果:hello slf4j

怎么样,是不是 很灵活方便。

那日志怎么记录到文件里面去呢?在项目中的resource下新建一个logback-spring.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration  scan="true" scanPeriod="10 seconds">

    <contextName>demo</contextName>

    <!-- 彩色日志 -->
    <!-- 彩色日志依赖的渲染类 -->
    <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" />

    <!-- 变量定义begin-->
    <!--默认日志格式: 时间日期 -> 日志级别 -> 线程ID -> 分隔符 -> 线程名 -> Logger名(通常对应的是类名) -> 日志内容 -->
    <!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
    <property name="LOG_FORMAT" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
    <!-- 定义日志存储的路径,不要配置相对路径 -->
    <property name="FILE_DIR" value="E:/git_rep/Lesson/lesson17/log/" />
    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_FORMAT" value="${CONSOLE_LOG_FORMAT:-%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}}"/>
    <!-- 变量定义end-->

    <!-- 日志输出方式定义 begin -->
    <!-- 控制台输出日志 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 日志级别过滤INFO以下 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <encoder>
            <!-- 按照上面配置的LOG_FORMAT来打印日志 -->
            <pattern>${CONSOLE_LOG_FORMAT}</pattern>
        </encoder>
    </appender>

    <!--输出到文件 这种方式是单个日志文件保存,文件会不停的增大,除非手动删除-->
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>${FILE_DIR}/spring-log.log</file>
        <append>true</append>
        <encoder>
            <!-- 按照上面配置的LOG_FORMAT来打印日志 -->
            <pattern>${LOG_FORMAT}</pattern>
        </encoder>
    </appender>

    <!-- 滚动日志输出 每天生成一个日志文件,保存30天的日志文件。FILE用来切分文件的 -->
    <appender name="FILE_ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志滚动策略,按照时间滚动-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${FILE_DIR}/spring-log-rolling.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 只保留7天的日志 -->
            <maxHistory>7</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- 日志文件的最大大小 -->
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!-- 超出删除老文件 -->
            <totalSizeCap>50MB</totalSizeCap>
        </rollingPolicy>
        <!--
            以上的配置是 当日志文件的大小达到10MB时,就新建一个日志文件,当滚动日志所占控件总和超过50MB时,就将最老
            的日志文件删除掉,最多保存7天的日志文件。超过7天也会将最老的日志文件删除。
            需要注意的是,如果日志文件比较大,如果1个小时就创建了5个日志文件,每个10MB,那下一个小时重新生成的日志文件
            会将上一个小时的日志文件覆盖掉,而且由于日志文件大小总和超过50MB,所以实际无法保存7天的日志文件。所以需要
            根据实际项目确定以上参数该怎么设置
        -->

        <encoder>
            <pattern>${LOG_FORMAT}</pattern>
        </encoder>
    </appender>
    <!-- 日志输出方式定义 end -->

    <!-- 日志输出级别 bgin-->
    <!--<root level="ERROR"><!–使用info级别输出日志到控制台、文件 及 滚动文件–>
        <!–采用上面定义的日志输出方式确定本项目究竟将日志输出到什么地方–>
        <appender-ref ref="CONSOLE" /><!–输出到终端–>
        <appender-ref ref="FILE" /><!–输出到文件–>
        <appender-ref ref="FILE_ROLLING" /><!–输出到文件,滚动输出,避免单个文件过大,通常采用这种方式–>
    </root>-->
    <!-- 日志输出级别 end-->

    <!--
        如果采用root定义,则是所有包的日志都会打印,如果要控制只需要当前的包,则使用下面的logger的标签定义
        name表示是打印哪个包下面的
        level表示这个包下面什么级别的日志打印出来
    -->
    <logger name="com.example" level="debug">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE_ROLLING" />
    </logger>
</configuration>

重新启动项目,打印日志,看控制台是不是彩色的输出。然后E:/git_rep/Lesson/lesson17/log/下面是否有日志文件。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

关注我们