添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

小弟的同事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)来触发。否则,他只会记录在文件里面。

问题来了,需求要的是不管有没有交易,都要发送。如果存在上面的问题,怎么办。
我的天才想法是,人工造一条假数据,定时去触发回滚
至于做法,收费内容,请付费。