当前位置:  开发笔记 > 编程语言 > 正文

为什么TimedRotatingFileHandler无法正常工作以及如何在日志行中解决此问题(轮换正在工作,但缺少日志行)

如何解决《为什么TimedRotatingFileHandler无法正常工作以及如何在日志行中解决此问题(轮换正在工作,但缺少日志行)》经验,为你挑选了1个好方法。

更新: TimedRotatingFileHandler我使用时工作不正常multiprocessing,我应该如何处理多处理日志?

我编写了自己的Logger类,如下所示,将其用作所有其他python脚本中的模块.

import logging
import logging.handlers

class Logger:
    DEFAULT_LOG_OUTPUT = "/home/haifzhan/"

    def __init__(self, logger_name, log_file_name, log_dir=DEFAULT_LOG_OUTPUT, log_level=logging.DEBUG):
        self.logger = logging.getLogger(logger_name,)
        self.formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')

        #self.file_handler = logging.FileHandler(log_dir + log_file_name)
        file_path = log_dir + log_file_name
        self.file_handler = logging.handlers.TimedRotatingFileHandler(file_path, when='H', backupCount=30)
        self.file_handler.setFormatter(self.formatter)
        self.logger.setLevel(log_level)
        self.logger.addHandler(self.file_handler)

        self.console_handler = logging.StreamHandler()
        self.console_handler.setFormatter(self.formatter)
        self.console_handler.setLevel(logging.DEBUG)
        self.logger.addHandler(self.console_handler)

    def get_logger(self):
        return self.logger

在我的python脚本的顶部,我创建了一个Logger实例.

 `logger = Logger("logger name", "logfile.log", log_dir=LOG_DIR, log_level=logging.INFO).get_logger()`  # always put it at the top of my script

它在我使用时工作得很好FileHandler,不幸的是它在我切换后省略了记录行TimedRotatingFileHandler.日志文件旋转按预期工作,但不记录所有行.控制台日志记录工作正常,怎么会这样?

self.file_handler = logging.FileHandler(log_dir + log_file_name)

self.file_handler = logging.handlers.TimedRotatingFileHandler(file_path, when='H', backupCount=30)

任何人都可以帮忙解决它吗?



1> MariusSiuram..:

不要使用来自所有进程的文件.相反,制作一些日志消息队列并有一个专用进程(主要或特殊进程)执行日志记录.

这应该消除进程和那些问题之间的竞争条件.

鉴于您已经设置了一个Logger类,实现应该非常简单.您可以拥有日志记录的全局/单例实例Queue(其中每个Logger实例都是put其日志),并通过单个中央进程管理实际日志记录.


编辑:一种可能的方法是使用一个特殊的处理程序:

class QueueLogger(Handler):
    def __init__(self, log_queue):
        """
        Initialize the handler with logging Queue.
        """
        Handler.__init__(self)
        self.log_queue = log_queue

    def emit(self, record):
        self.log_queue.put(record)

这将允许将记录(包含日志级别和额外信息)放入队列中.另一方面,您可以使用HubLogger,它可以执行以下操作:

while True:
    r = log_queue.get()
    my_handler.emit(r)

并且my_handler可以是TimedRotatingFileHandler您想要的任何处理程序.


感谢@unutbu,因为他们已在评论中评论了"Hub"方法.

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有