Log4j每日生成一个日志文件的问题
有个应用中需要每天生成一个记录文件sms.txt.yyyy-mm-dd.txt,并向合作方定时发送。编写程序来写文件很简单,每天生成一个文件也不难,但还是要写代码。想到log4j本身可以就有这些功能,有什么理由舍近求远,舍易求难呢?于是乎,对log4j进行配置,将需要记录并发送的文字信息直接写入单独的日志文件sms.txt当中。运行程序,发送一条请求,打印信息,写入文件。打开sms.txt文件,确认信息已经成功写入。然后,修改系统时间,将日期调为下一天。再发送一条请求,顺利生成sms.txt.yyyy-mm-dd.txt文件,并在新的sms.txt文件中写入记录。看似很顺利。接着做压力测试。重新启动程序,模拟10w条数据请求。因为快要下班,就让程序一直在服务器上运行,如果第二天生成了sms.txt.yyyy-mm-dd.txt文件,并且上传至指定FTP服务器,即算大功告成。
第二天过来,问题就来了。服务器上只有一个sms.txt文件,打开sms.txt文件,里面的10w条记录已经正常写入,但是并没有生成sms.txt.yyyy-mm-dd.txt文件,自然也没有上传成功。然而,进行相同配置的普通日志文件log.txt却是正常生成了log.txt.yyyy-mm-dd.txt文件。这是什么原因呢?两者之间有什么区别呢?我向正在运行的程序又发了一条请求,看看是什么情况。神奇的事情出现了:服务器自动生成了sms.txt.yyyy-mm-dd.txt文件,和昨天的测试结果一摸一样!看到这,两者的区别找到了!程序从昨天运行到今天,log日志文件会不停的写入信息,而sms文件在昨天10w条数据写入完成后,就停止写入了,直到今天刚刚测了一条。
这时,脑中出现了一个想法:log4j的日志文件生成会不会是事件驱动的?写入事件的发生,导致程序根据配置文件的内容进行相应文件的生成(或不生成)。所以,sms.txt文件在昨天停止写入后,到第二天由于没有写入事件,并不自动生成上一天的日志文件,而是等到我又测试了一条后,有了写入操作,才生成新文件。随后,我又进行几次测试,证实了这个想法。但如果真是这样,这个程序就有问题了。若第二天没有数据请求,就生成不了需要上传的sms.txt.yyyy-mm-dd.txt文件,上传动作便会失败。Log4j可不可以不用驱动,直接定时生成日志文件呢?待续。。。


然后呢?