之前用 python 写单进程多线程的应用时,使用 logging 记录日志写到同一个文件很正常,最近写了个多进程多线程的应用使用 logging 记录日志到同一个文件时就开始出现问题了,主要就是基于时间的文件归档时会出 bug 。
简单搜了一下也找到了原因:logging 是线程安全但是进程不安全,官方推荐使用 queue 或者 socket 来实现多进程日志记录到同一个文件,或者自己修改 doRollOver 相关的操作。
我想问的问题是,我其实并没有上面“多进程存储日志到一个日志文件”的需求,相反我是希望把每个进程的日志单独存储为一个文件的,但是实践上感觉不太方便,以下是详情:
之前写单进程多线程时,只要在 logging 的封装模块里初始化一个全局的 logger ,其它所有模块不管是在哪个线程里,只要 import 一下这个 logger 就可以直接拿来用。 但是现在写多进程多线程的时候问题就出现了:
- 如果仍然按照上述方法,那么不同进程 import 这个 logger 后,在自己的变量空间里虽然是互不干扰,但是在底层仍然操作同一个文件,因此会导致上面提到按时间归档的问题;
- 有一个解决方法是在每个进程的启动函数里初始化一个专属的 logger ,指定不同的存储文件,然后通过参数的方式传递给调用的所有模块 /函数,让这些模块 /函数直接使用这个 logger 。技术上可行,但是实践上非常不优雅,调用的每个子模块都要传递这个 logger 参数。
因为想问问大家,这个需求“多进程通过 logging 写日志到各自文件”是否有更优雅的实践?如果没的话,最后也只能回归官方通过 socket/queue 的方案来写单个文件了。