开发者

SpringBoot实现文件记录日志及日志文件自动归档和压缩

目录
  • 1、什么是Logback
  • 2、SpringBoot实现文件记录日志,日志文件自动归档和压缩
    • 2.1、配置
    • 2.2、日志记录到文件中
    • 2.3、日志文件自动归档和压缩
  • 总结

    1、什么是Logback

    Logback是一个Java日志框架,它是log4j的后继者,被广泛用于应用程序中记录日志。

    Logger(日志记录器):

    • Logger 是 Logback 中最重要的组件之一。它负责收集应用程序中的日志信息,并将其传递给适当的 Appender 进行处理。Logger 使用不同的日志级别来决定日志信息的输出方式。常见的日志级别有 DEBUG、INFO、WARN、ERROR 和 TRACE

      Appender(日志输出目的地):

    • Appender 决定日志信息的输出目的地。Logback 提供了不同类型的 Appender,比如 ConsoleAppender、FileAppender 和 SocketAppender 等。每个 Appender 可以配置不同的 Layout,用于定义日志信息的格式。

    Logback 的日志输出原理可以简单分为以下步骤:

    • 应用程序代码中使用 Logger 记录日志。Logger 根据日志级别决定是否将日志信息传递给 Appender。
    • 当 Logger需要输出日志时,它会将日志信息封装成一个 LogEvent 对象。
    • LogEvent 对象传递给配置好的 Appender。Appender 将根据配置将日志信息输出到不同的目的地,比如控制台、文件、远程服务器等。
    • 在输出日志之前,Appender 还会使用配置好的 Layout 对日志信息进行格式化。
    • 最终,格式化后的日志信息被输出到指定的目的地,供开发者和系统管理员查看和分析。

    2、SpringBoot实现文件记录日志,日志文件自动归档和压缩

    2.1、配置

    1、引入依赖

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

    2、在 resource 目录下 创建文件 logback-spring.XML 内容如下

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration scan="true" scanPeriod="10 seconds">
        <!--0. 日志格式和颜色渲染 -->
        <!-- 彩色日志依赖的渲染类 -->
        <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="log.path" value="./logs" />
        <property name="app.name" value="eric" />
        <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}}"/>
    
        <!--1. 输出到控制台-->
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>INFO</level>
            </filter>
            <encoder>
                <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
                <!-- 设置字符集 -->
                <charset>UTF-8</charset>
            </encoder>
        </appender>
    
        <!-- 2.2 level为 INFO 日志,时间滚动输出  -->
        <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    php        <!-- 正在记录的日志文档的路径及文档名 -->
            <file>${log.path}/${app.name}-info.log</file>
            <!--日志文档输出格式-->
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
                <charset>UTF-8</charset>
            </encoder>
            <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- 每天日志归档路径以及格式 -->
                <fileNamePattern>${log.path}/${app.name}/${app.name}-info-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
     www.devze.com               <maxFileSize>10MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
                <!--日志文档保留天数-->
                <maxHistory>15</maxHistory>
            </rollingPolicy>
            <!-- 此日志文档只记录info级别的 -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>INFO</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
        </appender>
    
        <!-- 2.3 level为 WARN 日志,时间滚动输出  -->
        <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 正在记录的日志文档的路径及文档名 -->
            <file>${log.path}/${app.name}-warn.log</file>
            <!--日志文档输出格式-->
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
                <charset>UTF-8</charset> <!-- 此处设置字符集 -->
            </encoder>
            <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${log.path}/${app.name}/${app.name}-warn-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy phpclass="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>10MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
                <!--日志文档保留天数-->
                <maxHistory>15</maxHistory>
            </rollingPolicy>
            <!-- 此日志文档只记录warn级别的 -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>WARN</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
        </appender>
    
        <!-- 2.4 level为 ERROR 日志,时间滚动输出  -->
        <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 正在记录的日志文档的路径及文档名 -->
            <file>${log.path}/${app.name}-error.log</file>
            <!--日志文档输出格式-->
            <encoder>
                <pattepythonrn>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
                <charset>UTF-8</charset> <!-- 此处设置字符集 -->
            </encoder>
            <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${log.path}/${app.name}/${app.name}-error-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>10MB</maxFileSize>
                </thttp://www.devze.comimeBasedFileNamingAndTriggeringPolicy>
                <!--日志文档保留天数-->
                <maxHistory>15</maxHistory>
            </rollingPolicy>
            <!-- 此日志文档只记录ERROR级别的 -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>ERROR</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
        </appender>
    
        <!--
        <logger name="org.springframework.web" level="WARN"/>
        <logger name="org.springframework.boot" level="WARN" />
        <logger name="springfox.documentation.spring" level="WARN" />
        <logger name="org.apache.shardingsphere" level="DEBUG" />
      -->
        <!-- 开发、测试环境 -->
        <springProfile name="dev,sit,test,uat">
            <logger name="org.springframework.web" level="INFO"/>
            <logger name="org.springframework.boot" level="INFO" />
            <logger name="springfox.documentation.spring" level="INFO" />
            <logger name="ShardingSphere-SQL" level="INFO" />
            <logger name="SQLStatement" level="INFO" />
            <logger name="com.alibaba.nacos.client.naming" level="WARN" />
            <logger name="org.apache.shardingsphere.core.route.SQLLogger" level="INFO" />
            <logger name="com.zkj.lawfirm.platform" level="INFO" />
        </springProfile>
    
        <!-- 生产环境-->
        <springProfile name="prod">
            <logger name="org.springframework.web" level="WARN"/>
            <logger name="org.springframework.boot" level="WARN" />
            <logger name="springfox.documentation.spring" level="WARN" />
            <logger name="org.apache.shardingsphere" level="WARN" />
            <logger name="ShardingSphere-SQL" level="WARN" />
            <logger name="com.alibaba.nacos.client.naming" level="WARN" />
            <logger name="org.apache.shardingsphere.core.route.SQLLogger" level="WARN" />
            <logger name="com.zkj.lawfirm.platform" level="INFO" />
        </springProfile>
    
        <root level="INFO">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="INFO_FILE" />
            <appender-ref ref="WARN_FILE" />
            <appender-ref ref="ERROR_FILE" />
        </root>
    
    </configuration>
    
    

    3、编写一个控制器用来访问测试

    package com.eric.springbootlog.demos.web;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @Controller
    @Slf4j
    public class BasicController {
    
        // http://127.0.0.1:8080/hello?name=lisi
        @RequestMapping("/hello")
        @ResponseBody
        public String hello(@RequestParam(name = "name", defaultValue = "unknown user") String name) {
            log.info("我是一条 info 日志");
            return "Hello " + name;
        }
    
    }
    
    

    2.2、日志记录到文件中

    此时我们启动项目,发现项目根目录会自动生成一个 logs 目录,发现日志已经成功记录到文件中了

    SpringBoot实现文件记录日志及日志文件自动归档和压缩

    此时我们再访问接口:http://127.0.0.1:8080/hello?name=lisi

    发现日志成功打印,并且成功记录到日志文件中

    SpringBoot实现文件记录日志及日志文件自动归档和压缩

    2.3、日志文件自动归档和压缩

    因为我在配置文件中已经配置好了,此时我们再手动更换下电脑的时间,我这里修改到第二天

    SpringBoot实现文件记录日志及日志文件自动归档和压缩

    此时我们再次访问接口:http://127.0.0.1:8080/hello?name=lisi

    SpringBoot实现文件记录日志及日志文件自动归档和压缩

    发现第二天的日志成功自动归档,并且成为压缩文件了~

    总结

    以上就是SpringBoot实现文件记录日志及日志文件自动归档和压缩的详细内容,更多关于SpringBoot日志文件归档和压缩的资料请关注编程客栈(www.devze.com)其它相关文章!

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜