同样是logback1.11,更换了log配置后,无论是否有线程持续不断写入log文件,log文件会按设定以日期序号轮换

上次发现了logback1.11的一个bug,即有线程持续写入log,则log文件不会按设定模式进行轮换。

但发现同样采用logback1.11的另外一个工程,它的日志文件就没有错误,于是参照其配置文件将logback.xml设定如下:

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!-- Where are log files -->
    <property name="LOG_HOME" value="d:/logs" />
    
    <!-- Output to Console -->
    <appender name="STDOUT"
        class="ch.qos.logback.core.ConsoleAppender">
        <encoder
            class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--%d:date,%thread:thread,%-5level:error/debug/info... %msg:message,%n:new line -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -%msg%n</pattern>
        </encoder>
    </appender>
    
    <!-- Output to File -->
    <appender name="FILE"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/logbackCfg3new.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>10KB</maxFileSize>
            <MaxHistory>60</MaxHistory>
        </rollingPolicy>
        
        <encoder
            class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--%d:date,%thread:thread,%-5level:error/debug/info... %msg:message,%n:new line -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -%msg%n</pattern>
        </encoder>
    </appender>

    <!-- log level TRACE, DEBUG, INFO, WARN, ERROR, ALL and OFF,default:DEBUG。-->
    <root level="ALL">
        <appender-ref ref="STDOUT" /> <!-- show log on console -->
        <appender-ref ref="FILE" /> <!-- show log in file -->
    </root>
</configuration>
复制代码

上面蓝字部分整段替换掉了原有的appender,而红色部分是关键所在。

然后,依然启动三个线程写log:

线程一:

复制代码
package logbackCfg;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class App {
    private final static Logger logger = LoggerFactory.getLogger(App.class);

    public static void main(String[] args) throws InterruptedException {
    
        while(true) {
            Thread.sleep(5000);
            logger.info("秦时明月汉时关");
            logger.error("万里长征人未还");
            logger.debug("但使龙城飞将在");
            logger.trace("不教胡马度阴山");
        }
    }
}
复制代码

线程二:

复制代码
package logbackCfg;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class App2 {
    private final static Logger logger = LoggerFactory.getLogger(App2.class);

    public static void main(String[] args) throws InterruptedException {
        while(true) {
            Thread.sleep(8000);
            logger.info("九里山前作战场");
            logger.error("牧童拾得旧刀枪");
            logger.debug("微风吹皱乌江水");
            logger.trace("恰似虞姬别霸王");
        }
    }
}
复制代码

线程3:

复制代码
package logbackCfg;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class NewDayThread {
    private final static Logger logger = LoggerFactory.getLogger(NewDayThread.class);

    public static void main(String[] args) throws InterruptedException {
        
        while(true) {
            Date currentTime = new Date();
            
            if(currentTime.compareTo(fixedDate())>0) {
                Thread.sleep(8000);
                logger.info("万里赴戎机,关山度若飞。");
                logger.error("朔气传金柝,寒光照铁衣。");
                logger.debug("将军百战死,壮士十年归。");
            }
        }
    }
    
    private static Date fixedDate() {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            return formatter.parse("2020-01-17 13:10:00");
        } catch (ParseException e) {
            return new Date();
        }
    }
}
复制代码

然后到目录中查看,发现没有发生因线程持续写log而导致文件不发生轮换的事情:

这样,1.11版本的bug就被绕过去了,只是修改logback配置文件的事情,可以说以最小代价达成了目的。

代码下载:https://files.cnblogs.com/files/xiandedanteng/logbackCfg3_20200117_2.zip

--END-- 2020-01-17 14:48

2020-01-21补记,下面的xml工作得正常:

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!-- Where are log files -->
    <property name="LOG_HOME" value="d:/logs" />
    
    <!-- Output to Console -->
    <appender name="STDOUT"
        class="ch.qos.logback.core.ConsoleAppender">
        <encoder
            class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--%d:date,%thread:thread,%-5level:error/debug/info... %msg:message,%n:new line -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -%msg%n</pattern>
        </encoder>
    </appender>
    
    <!-- Output to File -->
    <appender name="FILE"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/logbackCfg3new.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>1MB</maxFileSize>
            <MaxHistory>60</MaxHistory>
        </rollingPolicy>
        
        <encoder
            class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--%d:date,%thread:thread,%-5level:error/debug/info... %msg:message,%n:new line -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -%msg%n</pattern>
        </encoder>
    </appender>

    <!-- log level TRACE, DEBUG, INFO, WARN, ERROR, ALL and OFF,default:DEBUG。-->
    <root level="ALL">
        <appender-ref ref="STDOUT" /> <!-- show log on console -->
        <appender-ref ref="FILE" /> <!-- show log in file -->
    </root>
</configuration>
复制代码

 

posted @   逆火狂飙  阅读(320)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
历史上的今天:
2017-01-17 用df命令显示磁盘使用量和占用率。
2014-01-17 在centOS上安装VNC
2014-01-17 SCP远程拷贝命令
2014-01-17 【Canvas技法】绘制圆角六边形
2014-01-17 【高中数学/对数函数/大小比较】设a=2/ln2,b=3/ln3,c=e,则a,b,c的大小关系为?
生当作人杰 死亦为鬼雄 至今思项羽 不肯过江东
点击右上角即可分享
微信分享提示