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

时间:2020-09-08 06:10:04

标签: python logging python-3.7

这是我的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,但是日志是写在翻滚文件中,而不是新文件中。旧的处理程序被以某种方式使用。我想念什么?

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

0 个答案:

没有答案