日志记录滚动失败失败尽管很少

问题描述

这是我的python logging.py文件

import logging
import logging.handlers
import os
import __main__

__all__ = ['Logger']

Mkdir函数

def mkdir_p(*args):
    """Creates the directory if it does not exist and returns the base directory path"""
    new_path = os.path.join(*args)
    new_dir = os.path.dirname(new_path)
    if not os.path.exists(new_dir):
        os.makedirs(new_dir)
    return new_path

用于记录会话ID的其他过滤器

class ContextFilter(logging.Filter):
    """
    This is a filter which injects contextual information into the log.
    """

    def filter(self,record):
        if hasattr(__main__,'context') and hasattr(__main__.context,'id'):
            record.id = __main__.context.id
        else:
            record.id = ""
        return True

实际的记录器类

class Logger(object):
    
    logging_formatters = {
        'fmt': "[%(asctime)s] [ID:%(id)s] %(levelname)8s [%(thread)d] (%(name)s:%(lineno)03d) - %(message)s",'datefmt': "%d %b %Y %H:%M:%s"
    }

    def __new__(
            self,application_name=None,filename=None,*args,**kwargs
    ):
        if not isinstance(application_name,str) or not application_name:
            raise ValueError("Logger class expects a string type application name")

        if filename is None:
            filename = application_name

        if not filename.endswith(".log"):
            filename = filename.split('.')[0] + ".log"

        log_path = kwargs.get('log_path') or os.getenv('LOG_PATH',os.getcwd())
        service_name = kwargs.get('service_name','')
        console_level = kwargs.get('console_level',logging.INFO)
        file_level = kwargs.get('file_level',logging.DEBUG)

        logger = logging.getLogger(application_name)
        logger.propagate = True
        # Return the logger if it or its parent already has handlers associated
        current = logger
        while True:
            parent = current.parent
            if len(current.handlers) > 0:
                return logger
            current = parent
            if isinstance(parent,logging.RootLogger):
                break

        # Create console stream handler
        console_handler = logging.StreamHandler()
        f = ContextFilter()
        console_handler.addFilter(f)
        console_handler.setLevel(console_level)
        console_handler.setFormatter(
            logging.Formatter(**self.logging_formatters)
        )

        # Create rotating file log handler
        file_handler = logging.handlers.TimedRotatingFileHandler(
            filename=mkdir_p(log_path,service_name,filename),when="midnight"
        )
        file_handler.addFilter(f)
        file_handler.setLevel(file_level)
        file_handler.setFormatter(
            logging.Formatter(**self.logging_formatters)
        )

        # Attach both handlers to the generated logger object
        logger.addHandler(console_handler)
        logger.addHandler(file_handler)
        logger.setLevel(min(console_level,file_level))
        return logger

碰巧的是日期是17,但是日志是写在翻滚文件中,而不是新文件中。旧的处理程序被以某种方式使用。我想念什么?

我正在使用基于时间的处理程序进行午夜滚动。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)