美文网首页PythonDjango
django 多进程下,日志写入错乱问题

django 多进程下,日志写入错乱问题

作者: ugvibib | 来源:发表于2019-08-23 15:54 被阅读0次

    问题:使用django自带logging配置记录日志时发现,日志丢失与日志写入错乱

    原因:django logging 的实现,是基于python logging模块实现,而logging模块仅仅是线程安全的;而使用uwsgi启动项目时,是启动多个进程的;logging模块并没有保证多进程安全

    如果我们设定每个小时生成一个logger文件,设定写入的logger文件为info.log。这样他们的执行流程为:
    在1个进程下,日志的写入原理是:
    1、生成info.log;
    2、写入1小时日志;
    3、1小时之后,判定info.log-2018-11-30-1文件是否存在;如果存在则删除,然么重命名info.log为info.log-2018-11-30-1;
    4、重新生成info.log并将logger的文件句柄指向新的info.log文件;

    在2个进程下,日志的写入就会出现下面的现象:
    1、生成info.log;
    2、写入1小时日志;
    3、1号进程先判定info.log-2018-11-30-1文件是否存在,如果存在则删除,然么重命名info.log为info.log-2018-11-30-1;
    4、此时可能2号进程还在向info.log文件进行写入,由于写入流已经打开,所以他会继续向info.log-2018-11-30-1中写入。
    5、等到2号进程开始重命名操作,此时info.log-2018-11-30-1已经存在,然后他会进行删除操作,这样就会导致日志丢失。
    6、2号进程此时将info.log重命名为info.log-2018-11-30-1,也会导致1号进行继续向info.log-2018-11-30-1写入,这样就导致了日志错乱。

    解决方案: 给日志文件加锁,保证同一时间,只有一个进程在操作日志文件

    推荐三个安装包, 基于自己的使用场景自行选择

    pip install ConcurrentLogHandler==0.9.1
    

    此包的最后更新时间是 2013.7,可见很久没有人维护了。

    pip install concurrent-log-handler
    

    这个包是基于ConcurrentLogHandler继续维护。此包不足之处:只有 RotatingFileHandler 的改动,也就是说,只对大小分割文件的handler 做了优化,并没有对 TimeRotatingFileHandler 优化

    pip install pyloghandlers
    

    这个包是我基于 concurrent-log-handler 在保留核心功能的基本上做了一些改动,使其支持按大小、按日期切割文件

    关于3个包的详细使用方法,可以参考文档。

    参考:
    https://kommmy.github.io/2018/02/11/page/
    https://blog.csdn.net/qq_20690231/article/details/84644939
    https://www.jianshu.com/p/def0a24974e4

    相关文章

      网友评论

        本文标题:django 多进程下,日志写入错乱问题

        本文链接:https://www.haomeiwen.com/subject/bvxtectx.html