SpringBoot处理日志

SpringBoot处理日志

工作需求

需要把不同类的日志分开存储,方便查阅。例如Controller的日志存一个文件,Service的日志存一个文件。

需求分析

  • 日志一般都用slf4j,意思为简单日志门面,它是把不同的日志系统的实现进行了具体的抽象化,只提供了统一的日志使用接口,使用时只需要按照其提供的接口方法进行调用即可,由于它只是一个接口,并不是一个具体的可以直接单独使用的日志框架,所以最终日志的格式、记录级别、输出方式等都要通过接口绑定的具体的日志系统来实现,这些具体的日志系统就有log4j,logback,java.util.logging等,它们才实现了具体的日志系统的功能。
  • 常用的日志实现一般是log4j和logback。

解决方案

  • logback是springboot默认使用日志,所以采用他比较方便。

SpringBoot通过Logback记录日志

  1. 增加配置文件,默认logback-spring.xml 放在resources根目录下
<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <contextName>atguiguSrb</contextName>

    <!-- 日志的输出目录 -->
    <property name="log.path" value="logs" />

    <!--控制台日志格式:彩色日志-->
    <!-- magenta:洋红 -->
    <!-- boldMagenta:粗红-->
    <!-- cyan:青色 -->
    <!-- white:白色 -->
    <!-- magenta:洋红 -->
    
    <!--控制台打印日志格式-->
    <property name="CONSOLE_LOG_PATTERN"
              value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) %highlight([%-5level]) %green(%logger) %msg%n"/>
    <!--编码-->
    <property name="ENCODING"
              value="UTF-8" />
    <!--文件日志格式 记录比较详细 有时间、级别、类路径、行数、日志内容等-->
    <property name="FILE_LOG_PATTERN"
              value="%date{yyyy-MM-dd HH:mm:ss} [%-5level] %thread %file:%line %logger %msg%n" />
    <!--文件日志格式 记录比较简单 只有时间和日志-->
    <property name="FILE_LOG_PATTERN_SIMPLE"
              value="%date{yyyy-MM-dd HH:mm:ss} %msg%n" />



    
    <!-- 控制台日志 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>${ENCODING}</charset>
        </encoder>
    </appender>

    <!-- 文件日志 -->
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>${log.path}/log.log</file>
        <append>true</append>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>${ENCODING}</charset>
        </encoder>
    </appender>
    <!--滚动保存文件-->
    <appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <!--  要区别于其他的appender中的文件名字  -->
        <file>${log.path}/log-rolling.log</file>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>${ENCODING}</charset>
        </encoder>


        <!-- 设置滚动日志记录的滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志归档路径以及格式 -->
            <fileNamePattern>${log.path}/info/log-rolling-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!--归档日志文件保留的最大数量-->
            <maxHistory>15</maxHistory>

            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!--超过这个大小之前的日志归档-->
                <maxFileSize>10KB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

    </appender>

    <appender name="ROLLING_FILE_CONTROLLER" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--  要区别于其他的appender中的文件名字  -->
        <file>${log.path}/controller-log.log</file>
        <encoder>
            <pattern>${FILE_LOG_PATTERN_SIMPLE}</pattern>
            <charset>${ENCODING}</charset>
        </encoder>
        <!-- 设置滚动日志记录的滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志归档路径以及格式 -->
            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/controller/controller-log-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!--归档日志文件保留的最大数量-->
            <maxHistory>15</maxHistory>

            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>20MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

    <!-- 开发环境和测试环境 dev是application-dev.yml的前缀 通过这个区分日志记录 -->
    <springProfile name="dev,test">
        <!--name为记录日志的包名 level为日志级别-->
        <!--可以配置多个logger 给不同的包配置不同的 appender -->
        <!--保存controller文件下所有文件 all级别的日志,按照 ROLLING_FILE_CONTROLLER 规则保存-->
        <logger name="work.hujj.log.controller" level="all">
            <appender-ref ref="ROLLING_FILE_CONTROLLER" />
        </logger>
    </springProfile>

    <!-- 生产环境 不同的环境 可以配置不同的logger -->
    <springProfile name="prod">
        <logger name="com.atguigu" level="ERROR">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="FILE" />
        </logger>
    </springProfile>
</configuration>

2.在需要的地方输出log,加@Slf4j注解,就可以直接使用log.info(),log.error()等方法记录日志。

@RestController
@RequestMapping("log")
@Slf4j
public class LogController {
    @GetMapping("test")
    public String test() {
        log.info("log-test");
        return "success";
    }
}

3.附上maven依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

posted @ 2023-05-19 18:26  super_胡  阅读(50)  评论(0编辑  收藏  举报