【问题标题】:Python Logger module with a class and rotating log handling具有类和旋转日志处理的 Python Logger 模块
【发布时间】:2017-12-16 07:52:45
【问题描述】:

我正在将一组 .py 文件创建到一个“包”中,我希望所有这些文件都导入一个标准化的“记录器”,允许所有模块记录到一个文件中。

class BaseLogger():
def __init__(self, module_name, specific_task_name):
    logging.basicConfig(
        filename="app." + specific_task_name + "." + module_name + ".log",
        format="%(levelname)-10s;%(asctime)s;%(module)s;%(funcName)s;%(message)s;%(thread)s;%(threadName)s",
        #level=logging.DEBUG
    )
    self.baselogger = logging.getLogger("app." + module_name + "." + specific_task_name )
    self.baselogger.setLevel('DEBUG')

所以我的想法是我所有的 .py 文件,导入 BaseLogger 并实例化该对象,它会找到一个同名的当前记录器,因此记录到一个文件...

问题是我现在正在尝试创建一个旋转的日志结构并且只是丢失了......我已经添加到 .basicConfig [无法迭代],我想我应该做一个 self.baselogger.addHandler ..但这会使日志文件变空....

如何使用上面的“分类”实现创建循环日志文件...还是我做错了?...

谢谢

【问题讨论】:

    标签: python logging


    【解决方案1】:

    您不需要类包装器,因为日志记录模块的设计非常棒。您需要做的是注册/获取记录器并使用格式和文件处理程序对其进行配置。

    这是一个带有包装器的示例:

    class BaseLogger(object):
    
        def __init__(self, module_name, specific_task_name):
            filename = "app." + specific_task_name + "." + module_name + ".log",
            format = ("%(levelname)-10s;%(asctime)s;%(module)s;%(funcName)s;"
                      "%(message)s;%(thread)s;%(threadName)s"),
            # you do not have to keep the reference
            # it is possible to get logger from anywhere using getLogger
            self.logger = logging.getLogger(specific_task_name)
            self.logger.setLevel(logging.INFO)
    
            # make sure to add RotatingFileHandler only once
            # you might need to update condition if you have more than 1 handler
            if not self.logger.handlers:
                fh = handlers.RotatingFileHandler(filename,
                                                  mode='a',
                                                  maxBytes=MAX_LOG_FILE_SIZE,
                                                  backupCount=2,
                                                  encoding=None,
                                                  delay=0)
                fh.setLevel(logging.INFO)
                formatter = logging.Formatter(format)
                fh.setFormatter(formatter)
                self.logger.addHandler(fh)
    

    我会放弃一个课程并使用fabric 函数:

    def get_logger(name):
        # setup new logger here if it does not exist 
        # return instance if it is there
        pass
    

    【讨论】:

    • 感谢您的帮助...所以目前,我使用“main.py”文件运行并从 3-5 个模块文件中导入并线程输出...如果我的main.py 创建一个“日志”所有其他模块如何知道在 main.py 中记录到同一个文件?我想这就是为什么我认为我需要一个类包装器。
    • 您总是可以从任何地方通过其名称获取相同的记录器:logging.getLogger(specific_task_name)。这里的重点是设置一个文件处理程序,然后您可以按原样使用日志记录
    • dam 所以类的东西删除了一些逗号,但我正在切换到 specific_task_name 记录器获取......非常感谢!!!我花了一段时间才把它包裹在我的头上哈哈
    猜你喜欢
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 2011-11-18
    • 2011-09-17
    • 2020-08-09
    相关资源
    最近更新 更多