logback日志框架实现定时回滚清理(小时级)

背景:

小弟的同事A有一个特殊的需求---要求每小时不管有没有交易都记录应用的交易数据,并将记录的数据给他们。

需求很简单。实现看起来也没有问题。总体功能接手前,已经有人搞得差不多了。我只是在他的基础上浑水摸鱼,锦上添花而已。

 

废话:

为什么用logback?原本那个同事自己手工实现了这个记录的功能,没啥毛病,能正常使用,只是记录的数据不会自动清理,偶尔打爆下磁盘让新的交易丢失(问题不大,测试数据);没有压缩,手工压缩并从服务器上下载时候,有点惆怅;交易影响吧,有限,因为是分环境的,这个环境不会有很大的流量(也大不了,交易过程直接同步操作io)。

 

之前将应用从用logback改成用log4j2,虽然最后没有用上这个高大上的框架。

所以,同事A恰好又有关于这个功能需求找到我,没法,看了代码,我这人懒,一知半解之后,觉得可以用日志框架代劳的东西,为什么要自己造轮子呢。可能这就是我还是码农的原因吧。

于是,加了些配置,改了几行代码,将记录交易数据的方式稍微调整了下。

 

网上有很多logback的资料,关于定时自动回滚,自然也是有不少人log。

问题是,很多人写,我也看了很多,只是觉得很都是废话,价值不高,对我根本没有参考价值。

我需要的是按小时自动回滚、删除的,网上很多都是按天的,按小时的不是没有,或者就牛头不搭马嘴。

看到有个自己实现logback接口,将回滚周期改成小时的(这个有点意思,但并非我要的,我不想自己写代码并且logback源码是支持秒分时日月等多种格式)

实在找不到,那就深入看下源码,看怎么配置咯。

 

解决方案:

网上找了个logback的配置文件来<?xml version="1.0" encoding="UTF-8"?><configuration debug="false">


    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <property name="LOG_HOME" value="/home" />

    <!--控制台日志, 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度,%msg:日志消息,%n是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> </appender> <!--文件日志, 按照每天生成日志文件 --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
     <file>temp.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}/temp.log.%d{yyyy-MM-dd}.log.zip</FileNamePattern>
            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>


    <!-- 日志输出级别 -->
    <root level="DEBUG">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE"/>
    </root>
</configuration>
关键配置:
<FileNamePattern>${LOG_HOME}/%d{yyyyMMdd}/temp.log.%d{yyyyMMdd}.log.zip</FileNamePattern>
这个是文件命名模式,也就是说在logback进行日志文件回滚时,会按照配置给定的方式进行回滚
首先是路径
上面是按照给的基本路径,在这个基本路径再创建一个子目录,这个子目录按照年月日进行命名创建
接下来的是文件名称---回滚的文件如何命名
文件名称按照日期进行区分,并且会进行压缩(如果后缀不是zip/gz,则不会进行压缩)
让我们经配置改成下面这样
<FileNamePattern>${LOG_HOME}/%d{yyyyMMddHH}/temp.log.%d{yyyyMMdd}.log.${i}.zip</FileNamePattern>
这样logback会识别出我们设置的子目录格式,将回滚周期改成hour制,每小时生成一个文件夹,并将对应的文件压缩到里面。

大写的注意:
有些朋友对logback不熟的,不知道logback的回滚触发机制,普及下
假如有两笔交易B and C
如果B在2022年6月7日20:46发生,C在2022年6月7日21:46发生,那么你在
2022年6月7日21:47会看到一个2022060720的文件夹,下面有一个temp.log.20220607.log.0.zip
如果B在
2022年6月7日20:46发生,C在2022年6月8日21:46发生,那么你在2022年6月8日21:47会看到一个2022060720的文件夹,下面有一个temp.log.20220607.log.0.zip
大家快来找不同。
是的,回滚需要被下一笔交易(准备来说,是下一笔log)来触发。否则,他只会记录在文件里面。

问题来了,需求要的是不管有没有交易,都要发送。如果存在上面的问题,怎么办。
我的天才想法是,人工造一条假数据,定时去触发回滚
至于做法,收费内容,请付费。
posted @ 2022-06-07 20:55  !!HelloWorld!!  阅读(2127)  评论(0编辑  收藏  举报