python进程写文件与多进程记录日志

时间:2022-05-01 04:06:11

假设有个进程,一直在写一个名字叫做1的文件,然后我们在它运行的过程中将文件改名了,会发生什么事情呢?

写个程序试试:

python进程写文件与多进程记录日志

然后运行它,此时可以看到:

python进程写文件与多进程记录日志

因为进程得到了文件的句柄,所以就算这个文件改名为2了,它也会继续往2这个文件写入的。

这样也就解释了apache在linux启动多个进程响应url请求时,调用TimeRotatingFileHandler时,第二个进程把第一个进程的日志名错误改名为带后缀的文件名,第一个进程也会依旧往带后缀的文件里写入后续的日志。所以看起来xxx.log和xxx.log.20160417都不停的有18号的日志写入。

所以django在linux下多进程使用TimeRotatingFileHandler写日志会有问题。

目前看来,有2种方法处理多进程写日志的问题:

1.进程id加到文件名中,但是apache重启时子进程id也会变;这样可能存在多个非当天的日志但不带时间后缀(进程id不一样)

2.使用concurrentlog第三方库记录日志,下载地址:

https://pypi.python.org/pypi/ConcurrentLogHandler/0.9.1


经过和同事交流,得知一个多进程按日期写日志的库。向作者致敬:

https://github.com/kieslee/mlogging