我使用的logback版本是1.2.3

目前logback支持根据时间来配置产生日志文件,但是只支持每周,每天,每个小时,每分钟等创建一个文件,配置如下:

<appender name="SYSTEM"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.home}/system.log</file> <rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover ,每天生成一份日志文件-->
<fileNamePattern>${log.home}/system.%d{yyyy-MM-dd}.log
</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy> <encoder>
<pattern>%d{HH:mm:ss} %-5level [%thread][%file:%line] : %msg%n
</pattern>
</encoder>
</appender>

但是需求是无法想象的,像突然又要求每隔一段时间之后生成一个配置文件,比如logback每隔10分钟生成一个日志文件,或每隔30分钟生成一份日志文件,每隔2个小时生成一个日志配置文件等。

下面以每隔10分钟生成一个日志文件,首先看一个每分钟生成一个配置文件 的配置

<appender name="SYSTEM"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.home}/system.log</file> <rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover ,每天分钟生成一份日志文件-->
<fileNamePattern>${log.home}/system.%d{yyyy-MM-dd-HH-mm}.log
</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy> <encoder>
<pattern>%d{HH:mm:ss} %-5level [%thread][%file:%line] : %msg%n
</pattern>
</encoder>
</appender>

但是发现在配置中,没有指定每隔多长时间来生成一个配置文件,没办法,只能看源码,加百度了。首先看配置里面的

<rollingPolicy  class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
TimeBasedRollingPolicy 这个类就是日志文件生成的策略类,看它的源码

再看这个timeBasedFileNamingAndTriggeringPolicy触发策略,在ch.qos.logback.core.rolling.TimeBasedRollingPolicy类的start方法中有这样一段代码

        if (timeBasedFileNamingAndTriggeringPolicy == null) {
timeBasedFileNamingAndTriggeringPolicy = new DefaultTimeBasedFileNamingAndTriggeringPolicy<E>();
}

这说明timeBasedFileNamingAndTriggeringPolicy是可以被外部设置的,如果没有设置刚使用默认的实现。我们再看DefaultTimeBasedFileNamingAndTriggeringPolicy,这里面的判断是否触发 写日志的方法:

 public boolean isTriggeringEvent(File activeFile, final E event) {
long time = getCurrentTime();
if (time >= nextCheck) {
Date dateOfElapsedPeriod = dateInCurrentPeriod;
addInfo("Elapsed period: " + dateOfElapsedPeriod);
elapsedPeriodsFileName = tbrp.fileNamePatternWithoutCompSuffix.convert(dateOfElapsedPeriod);
setDateInCurrentPeriod(time);
computeNextCheck();
return true;
} else {
return false;
}
}

这里面有一个比较即time> nextCheck,如果当前时间大于下一个判断时间,则触 发生成日志,这里面有一个计算NextCheck时间的方法:computeNextCheck();

    protected void computeNextCheck() {
nextCheck = rc.getNextTriggeringDate(dateInCurrentPeriod).getTime();
}

再看这个方法:rc.getNextTriggeringDate,根据它最终可以找到:

 public Date getEndOfNextNthPeriod(Date now, int periods) {
return innerGetEndOfNextNthPeriod(this, this.periodicityType, now, periods);
} public Date getNextTriggeringDate(Date now) {
return getEndOfNextNthPeriod(now, 1);
}

它最终还是调用的 public Date getEndOfNextNthPeriod(Date now, int periods)方法,我们可以看到之前说的每小时,每分钟,都是这里调用的是

getEndOfNextNthPeriod(now, 1); 如果我们想实现每2小时,每10分钟的话,只需要调用
getEndOfNextNthPeriod(now, 2); 或getEndOfNextNthPeriod(now, 10);至于是小时还是分钟,是由这个innerGetEndOfNextNthPeriod方法时里面判断的,是根据你的配置文件生成的PeriodicityType决定的。那我们要实现自己的每隔n段时间之后生成一个配置文件,只需要实现一个自己的类即可
package com.common.log;

import ch.qos.logback.core.joran.spi.NoAutoStart;
import ch.qos.logback.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy; @NoAutoStart
public class MyTimeBasedFileNamingAndTriggeringPolicy<E> extends DefaultTimeBasedFileNamingAndTriggeringPolicy<E> {
//这个用来指定时间间隔
private Integer multiple = 1; @Override
protected void computeNextCheck() {
nextCheck = rc.getEndOfNextNthPeriod(dateInCurrentPeriod, multiple).getTime();
} public Integer getMultiple() {
return multiple;
} public void setMultiple(Integer multiple) {
if (multiple > 1) {
this.multiple = multiple;
}
}
}

对应的配置如下:

<appender name="SYSTEM"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.home}/system.log</file> <rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover ,每10分钟生成一份日志文件-->
<fileNamePattern>${log.home}/system.%d{yyyy-MM-dd-HH-mm}.log
</fileNamePattern>

<timeBasedFileNamingAndTriggeringPolicy

class="com.common.log.MyTimeBasedFileNamingAndTriggeringPolicy">

<multiple>10</multiple>

</timeBasedFileNamingAndTriggeringPolicy>

            <maxHistory>7</maxHistory>
</rollingPolicy> <encoder>
<pattern>%d{HH:mm:ss} %-5level [%thread][%file:%line] : %msg%n
</pattern>
</encoder>
</appender>

儿童三轮车1--3童车,送给孩子的礼物


以上配置即可实现每隔10分钟创建一个日志文件。需要注意的是,日志文件只有在有日志写入时才会判断是否创建一个新的日志文件,如果只是启动服务器,会创建一个当前时间的日志文件 ,如果一直没有日志写入,10分钟之后也不会自动创建日志文件。只有在日志数据写入时才创建。

logback 指定每隔一段时间创建一个日志文件的更多相关文章

  1. python每隔一段时间做一个事情

    #!/usr/bin/env python #coding:utf8 #Author:lsp #Date:下午2:17:54 #Version:0.1 #Function: 每隔一段时间做一个事情 f ...

  2. C# 创建一个日志文件

    private static string m_fileName = "C:\\ErrorMsg.txt"; public static void CreateErrorLog(s ...

  3. worker 启动时向 etcd 注册自己的信息,并设置一个带 TTL 的租约,每隔一段时间更新这个 TTL,如果该 worker 挂掉了,这个 TTL 就会 expire 并删除相应的 key。

    1.通过etcd中的选主机制,我们实现了服务的高可用.同时利用systemd对etcd本身进行了保活,只要etcd服务所在的机器没有宕机,进程就具备了容灾性. https://mp.weixin.qq ...

  4. C#实现每隔一段时间执行代码(多线程)

    总结以下三种方法,实现c#每隔一段时间执行代码: 方法一:调用线程执行方法,在方法中实现死循环,每个循环Sleep设定时间: 方法二:使用System.Timers.Timer类: 方法三:使用Sys ...

  5. js setInterval每隔一段时间执行一次

    js setInterval每隔一段时间执行一次setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式.setInterval() 方法会不停地调用函数,直到 clearI ...

  6. delphi中我用定时器每隔一段时间执行操作

    delphi中,我用定时器每隔一段时间执行数据库插入及更新工作!adoquery.close;adoquery.sql.cleare;adoquery.connection:=con1;adoquer ...

  7. 【C#-多线程】实现每隔一段时间执行代码(多线程) 3种定时器

    总结以下三种方法,实现c#每隔一段时间执行代码: 方法一:调用线程执行方法,在方法中实现死循环,每个循环Sleep设定时间: 方法二:使用System.Timers.Timer类: 方法三:使用Sys ...

  8. 隔一段时间应用就会挂掉(进程在,但停止响应,也无log输出),必须重启tomcat

    此处是转载的  是给自己做的备注 问题:隔一段时间应用就会挂掉(进程在,但停止响应,也无log输出),必须重启tomcat 原因查找:由于tomcat自身log中并无错误产生,磁盘空间足够,读写也正常 ...

  9. TLS 改变密码标准协议(Change Cipher Spec Protocol) 就是加密传输中每隔一段时间必须改变其加解密参数的协议

    SSL修改密文协议的设计目的是为了保障SSL传输过程的安全性,因为SSL协议要求客户端或服务器端每隔一段时间必须改变其加解密参数.当某一方要改变其加解密参数时,就发送一个简单的消息通知对方下一个要传送 ...

随机推荐

  1. VS2013使用滚动条缩略图、双击选中高亮、配色方案、代码竖虚线(缩进标尺)

    1.双击代码或选中代码高亮,用以下插件,反应很灵敏,我安装的是第三个 2.代码编辑器的滚动条缩略图是VS自带的,需要打开菜单----工具----选项,如下图设置: 3.VS默认的选中颜色,需要打开菜单 ...

  2. Java 读取 Json格式的 内容

    一.Json 报文格式如下: 二.获取 Json 报文中字段的内容 import java.io.IOException; import com.fasterxml.jackson.core.Json ...

  3. 关于Python中迭代器的作用

    迭代器的定义:含有__iter__()方法和__next__()方法的就是迭代器,即(iterate) 含有__iter__()方法就可以使用for循环,即iterable(可迭代的) Iterabl ...

  4. html中不常用但必须知道的标签

    1.<b>加粗</b> 为天地立心,为生民立命,为往圣继绝学,为万世开太平 2.<s>删除线</s> 为天地立心,为生民立命,为往圣继绝学,为万世开太平 ...

  5. 在队列中join()与task_done()的关联性

    1.基础解释: Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号 Queue.join() 实际上意味着等到队列为空,再执 ...

  6. 《Zero MQ》

    原文链接 http://www.aosabook.org/en/zeromq.html ZeroMQ ZeroMQ 是一个消息系统,或者‘面向消息的中间件’.广泛应用于金融服务,游戏开发,嵌入式系统, ...

  7. 提取一个txt 文档中含指定字符串的所有行

    将一个txt 文档中含指定字符串内容的所有行提取出来并保存至新的txt文档中 例如,要提取 1.txt 中所有包含”aaa” 的行的内容 只需在此文件夹中新建一个bat文件,输入以下代码,双击运行,便 ...

  8. yii的数据库相关操作

    获取某一列数据 self::find()->where(['pid'=>$this->id])->select('id')->column(); 更新操作 $model- ...

  9. Spring Boot Thmeleaf的语法 day04

    一.Thmeleaf语法的使用 html格式的页面放在classpath:/templates/就会自动渲染. 1.在pom.xml导入 <dependency> <groupId& ...

  10. 温习排序算法(基于C指针)

    以前学过的数据结构课,貌似已经忘得一干二净了,偶然又翻起,书中最后一章详细介绍了7种排序算法,现在对其中4种做个总结.(为啥只总结4种,当然是因为偷懒,只想总结简单又常用的!) 先贴一张排序分类图: ...