最近接手了一个流传很多手的魔性古早代码,追日志时发现有明显缺失。对log4j不熟,不过可以猜测日志出问题肯定和多进程使用同一个log4j配置有关。经多次排查,终于捋清了其中逻辑。本文对排查过程进行复盘。

一、表征

故事背景:项目有多个入口。一边即以持续运行获取消息的后台进程形式运行,一边又作为单次任务调度的普通进程被不断启动并结束退出。也就是说,同一个项目同时运行着多个进程,并且使用着同一个log4j配置。
下面称后台进程为进程A,普通进程为进程B。A在后台持续运行,B多次短暂执行。
|<----------------- A ------------------- ......
|<- B ->| |<--- B --->| |<- B ->|
起因:进程B的运行效果与预计不符,需排查B的日志定位问题。
神奇的现象:
1)有的B有日志有的没有,没发现明显的出现规律。
2)有的B日志完整,有的不完整。
3)只有近几个小时的B有日志,写进文件的B的日志居然过一段时间会消失。
4)历史日志中,绝大多数日期只有一个B的日志,而个别日志有很多。
 
 

二、内因

每一个A/B的日志指针都分别以append方式打开日志文件,文件指针互相独立,各自向后写。从而导致两个问题:
问题1:因A写的慢、B写的快(业务实际情况),所以每一个B均在文件末尾append,和上一B相邻,而A会逐渐覆盖B的日志,直到开始滚动分页。
 
问题2:当切换到下一自然日0点时,开始滚动分页时,如果此时有B正在运行,则A和B各自有一个指针。
如果A先写,则两次滚动分页后,A往log.yesterday中写,而B往log中写,并在任务完成后释放句柄并退出。新的B继续在log中写。
如果B先写,则两次滚动分页后,A往log中写,B往log.yesterday中写,并在任务完成后释放句柄并退出。新的B继续在log中写。
无论如何,真正的log.yesterday都已经被覆盖。
 
 
 
day1
day2
day3
day4
day5
day6
假设  
A先写
A先写
B先写
B先写
A先写
log
day1的A+B
day2的B
day3的B
day4的A+其他B
day5的A+其他B
day6的B
log.day1
 
day2的A
day2的A
day2的A
day2的A
day2的A
log.day2    
day3的A
day3的A
day3的A
day3的A
log.day3      
day4的第一个B
day4的第一个B
day4的第一个B
log.day4        
day5的第一个B
day5的第一个B
log.day5          
day6的A
 
D日(D <= T-2)的日志只有四种情况:(T日即当前日期)
① 记录了D+1日的第一个B(因为D+1日有B跨天,且B先写)
② 记录了D+1日的所有A(因为D+1日有B跨天,且A先写)
③ 记录了D日的所有A+ 未被覆盖的B(因为D+1日没有B跨天,且D日B先写)
④ 记录了D日的所有的非首个B(因为D+1日没有B跨天,且D日A先写)
 
符合观察到的现象。
done

多进程使用同一log4j配置导致的日志丢失与覆盖问题的更多相关文章

  1. 日志log4j配置详情,日志log具体到你想不到

    一.Log4j简介Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局). 1.LoggersLoggers组件在此系统中被分为五个级别:DEBU ...

  2. 配置Tomcat的日志系统

    成功配置tomcat的log4j日志系统,格式:HTML+每天以yyyy-mm-dd.log命名的日志文件 一.引言: 实习单位让用log4j配置webapp的日志系统,要求产生的日志文件是html格 ...

  3. log4j配置日志文件log4j.appender.R.File相对路径方法

    方法一. 解决的办法自然是用相对路径代替绝对路径,其实log4j的FileAppender本身就有这样的机制,如:log4j.appender.logfile.File=${WORKDIR}/logs ...

  4. Log4j配置的经典总结,打印日志文件,日志存库

        一.介绍 Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制 日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务 器.NT的事件记录器.UNIX Sy ...

  5. Log4j实现对Java日志的配置全攻略

    1. 配置文件 Log4J配置文件的基本格式如下: #配置根Logger log4j.rootLogger = [ level ] , appenderName1 , appenderName2 , ...

  6. Log4j配置详解及不同的包(package)下的日志写入到不同的日志文件下

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt262 以下都是log4j.properties要写入的内容: 一:参数介绍: ...

  7. Log4j按级别输出日志到不同文件配置分析 (转:projava)

    关于LOG4J 按照级别输出日志,并按照级别输出到不同文件中的说法有很多, 网上贴的最多的log4j.properties的设置是这样的 log4j.rootLogger=info,stdout,in ...

  8. log4j 配置日志输出(log4j.properties)

    轉: https://blog.csdn.net/qq_29166327/article/details/80467593 一.入门log4j实例 1.1 下载解压log4j.jar(地址:http: ...

  9. log4j日志输出到日志文件中和控制台中 +log4j配置详解

    1.引入log4j的jar包 https://mvnrepository.com/,可以找到log4j的jar和依赖. 2.创建log4j.properties,并配置log4j #设置日志的级别 , ...

随机推荐

  1. 又到了卸载Notepad++的时候了?

    逛开源中国(OSCHINA),无意中发现一贴<不用Notepad++,你还有这些更好的选择> 才发现,原来 Notepad++ 的作者侯今吾前几天又在 npp 的官网上发表了一篇个人政治意 ...

  2. Linux系统运行级别和关机重启命令介绍

    Linux系统运行级别介绍 Linux系统有七种运行级别(Run Level),各个运行级别下,系统有不同的状态,各个级别的意义描述如下. 0:关键级别1:单用户运行级别,运行rc.sysinit和r ...

  3. 一款用于绘制状态机转换图和流程图的web在线绘图工具

    大型软件系统中离不开各类状态机的处理,日常工作中也涉及到各类事务处理流程:从表现力看文不如表,表不如图:因此日常工作中经常需要绘制各种状态机的状态转换图和流程图,以协助理解代码逻辑和各类事务处理流程等 ...

  4. 基于canvas的流程编辑器

    今年由于项目上需要给客户的流程管理系统进行升级,其中包含流程的可视化.于是在网上找一些可以用的轮子,考察了D3,js.GooFlow.js.G6-Editor等工具后,发现D3,js学习成本太高,G6 ...

  5. CSP-S 46 题解

    改完题了,就稍写一下题解,顺便反思一下! 其实这次考试挺水的,然而我也挺水的,看了考试结束后的成绩,就吃-*了! T1 set 这个我考试的时候实在是没有想到如何去判断-1,然后我就觉得这神仙题没法解 ...

  6. salesforce lightning零基础学习(十四) Toast 浅入浅出

    本篇参考: https://developer.salesforce.com/docs/component-library/bundle/force:showToast/specification h ...

  7. Android常见内存泄露

    前言 对于内存泄漏,我想大家在开发中肯定都遇到过,只不过内存泄漏对我们来说并不是可见的,因为它是在堆中活动,而要想检测程序中是否有内存泄漏的产生,通常我们可以借助LeakCanary.MAT等工具来检 ...

  8. 201871010114-李岩松《面向对象程序设计(java)》第二周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  9. javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: ResultSet is from UPDATE. No Data.

    Java jpa调用存储过程,抛出异常如下: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCEx ...

  10. 6. SOFAJRaft源码分析— 透过RheaKV看线性一致性读

    开篇 其实这篇文章我本来想在讲完选举的时候就开始讲线性一致性读的,但是感觉直接讲没头没尾的看起来比比较困难,所以就有了RheaKV的系列,这是RheaKV,终于可以讲一下SOFAJRaft的线性一致性 ...