SpringBoot 日志

前言

SpringBoot对常用的技术都进行了一次简单的封装(封装成一个start启动包),使我们在开发项目的时候可以简单的上手。同样的SpringBoot对日志框架也进行了封装。

springBoot 封装的日志框架

<dependency>
  <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
    <version>xxx</version>
  <scope>compile</scope>
</dependency>

在实际的开发web项目中我们并不需要引入这个pom,因为在spring-boot-starter-web已经引入了

image.png

Springboot默认使用的是logback日志框架

使用

引入spring-boot-starter-logging包后,此时已经可以通过编码的形式获取

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TestController {
  private final static Logger logger= LoggerFactory.getLogger(TestController.class);

  public Result<String> hello(Integer a){
    logger.info("hello world");
  }
}

再次引入lombok即可通过注解的形式使用,Slf4j是一个编译阶段的注解,编译之后就会消失,通过在编译生成java字节码时生效,帮助我们添加一些代码,不用我们自己手写,加快编程效率

<!-- lombok -->
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.16.10</version>
</dependency>
@Slf4j
@RestController
@RequestMapping(value = "/test")
public class TestController {
  public Result<String> hello(Integer a){
    log.info("hello world");
  }
}

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!--
    根节点属性介绍:
    scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true
    scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟
    debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false
-->
<configuration  scan="true" scanPeriod="60 seconds" debug="true">

    <!-- 引入其他配置文件中的属性 -->
    <property resource="log.properties" />
    <!-- 引入sprig环境中的配置属性 -->
    <springProperty scope="context" name="server.servlet.context-path" source="server.servlet.context-path" />
    <springProperty scope="context" name="spring.application.name" source="spring.application.name" />
    
    <!-- 应用名称,可以通过%contextName来使用,默认值为“default” -->
    <contextName>my-web-service</contextName>


    <!-- 设置一些变量,可以通过${}的形式使用:${log.dir} -->
    <property name="pattern" value="%d{HH:mm:ss.SSS} [%thread] [%-5level] %logger{36} - %msg%n" />
    <property name="file.pattern" value="%d [%thread] %-5level %logger{36} - %msg%n" />

    <!--
        日志如何输出,每一个appender封装一个输出方式
        name:appender的名称
        class:指定输出方式,不同的类对应不同的输出方式,通常使用的是输出到文件和输出到控制台
    -->
    <!-- 输出到控制台 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!--输出到文件-->
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--如果只是想要 Info 级别的日志,只是过滤 info 还是会输出 Error 日志,因为 Error 的级别高,
        所以我们使用下面的策略,可以避免输出 Error 的日志-->
<!--        <filter class="ch.qos.logback.classic.filter.LevelFilter">-->
<!--            &lt;!&ndash;过滤 Error&ndash;&gt;-->
<!--            <level>ERROR</level>-->
<!--            &lt;!&ndash;匹配到就禁止&ndash;&gt;-->
<!--            <onMatch>DENY</onMatch>-->
<!--            &lt;!&ndash;没有匹配到就允许&ndash;&gt;-->
<!--            <onMismatch>ACCEPT</onMismatch>-->
<!--        </filter>-->
        <!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
            如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
            的日志改名为今天的日期。即,<File> 的日志都是当天的。
        -->
        <File>${log.dir}${server.servlet.context-path}/${spring.application.name}/info.log</File>
        <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
            <FileNamePattern>${log.dir}${server.servlet.context-path}/${spring.application.name}/info.%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--只保留最近30天的日志-->
            <maxHistory>30</maxHistory>
            <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
            <!--<totalSizeCap>1GB</totalSizeCap>-->
        </rollingPolicy>
        <!--日志输出编码格式化-->
        <encoder>
            <charset>UTF-8</charset>
            <pattern>${file.pattern}</pattern>
        </encoder>
    </appender>

    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--如果只是想要 Error 级别的日志,那么需要过滤一下,默认是 info 级别的,ThresholdFilter-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>Error</level>
        </filter>
        <!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
            如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
            的日志改名为今天的日期。即,<File> 的日志都是当天的。
        -->
        <File>${log.dir}${server.servlet.context-path}/${spring.application.name}/error.log</File>
        <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
            <FileNamePattern>${log.dir}${server.servlet.context-path}/${spring.application.name}/error.%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--只保留最近30天的日志-->
            <maxHistory>30</maxHistory>
            <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
            <!--<totalSizeCap>1GB</totalSizeCap>-->
        </rollingPolicy>
        <!--日志输出编码格式化-->
        <encoder>
            <charset>UTF-8</charset>
            <pattern>${file.pattern}</pattern>
        </encoder>
    </appender>

    <!-- 规定采用那些输出方式,level:日志输出级别 -->
    <root level="info">
        <appender-ref ref="console" />
        <appender-ref ref="file" />
        <appender-ref ref="file_error" />
    </root>
</configuration>

参考文件:https://blog.csdn.net/qq_43842093/article/details/122802897

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容