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)来触发。否则,他只会记录在文件里面。
问题来了,需求要的是不管有没有交易,都要发送。如果存在上面的问题,怎么办。
我的天才想法是,人工造一条假数据,定时去触发回滚
至于做法,收费内容,请付费。