python中的条件记录

时间:2011-08-16 18:37:06

标签: python logging

我想在模块中包含日志记录,但我不希望模块创建新的日志对象/文件,我希望它使用调用者日志对象,无论可能是什么,但只有当他们通过一个。我知道我可以将所有日志调用放在try块中,但这很尴尬。我最终提出的似乎是有效的,但它看起来非常糟糕,我相信有更好的方法可以做到。

class MyClass(object):
    def __init__(self, arg1, arg2, log=None):
        if log == None:
            class log(object):
                def error(self, msg): pass
                def warning(self, msg): pass
                def info(self, msg): pass
                def debug(self, msg): pass
            self.log = log()
        else:
            self.log = log
        self.log.debug('Starting')

做这样的事情有什么更好的方式?

谢谢!

3 个答案:

答案 0 :(得分:1)

大多数记录器使用工厂模式让一些集中资源管理哪些类(如果有)获取实际记录的记录器(而不是调用虚函数)。这意味着存在集中式API,集中控制,并且不需要在逐个类的基础上定义记录器。

将传递的参数视为从一件事物到另一件事物的信号通常是个好主意,“你需要使用这个对象做你的工作。”除非MyClass是一个记录器,否则将它作为一个参数传递它是没有意义的 - 它不应该需要一个记录器来完成它的工作,如果这样做是不好的设计。

答案 1 :(得分:0)

直接使用logging模块提供的功能,即:

logging.debug('Starting')

并将其留给调用者以根据需要更改根记录器。

答案 2 :(得分:0)

首选模式:

import logging
LOGGER = logging.getLogger(__name__)

class MyClass(object):
    logger = LOGGER

    def do_something(self, somesuch):
        self.logger.debug("Starting %s", somesuch)

myInstance = MyClass()
if need_fancy_logging:
    myInstance.logger = logging.getLogger("FancyLogger")

myInstance.do_something("blabla")

编辑:标准logging模块真的,实际上做的一切都是正确的,包括什么都没有。

Python 2.7 (r27:82500, Sep 16 2010, 18:03:06) 
[GCC 4.5.1 20100907 (Red Hat 4.5.1-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import logging
>>> log = logging.getLogger('foo')
>>> log.debug('debug')
>>> log.info('info')
>>> log.error('error')
No handlers could be found for logger "foo"
>>> log.error('error')
>>> 

请注意,绝对会发生 no 输出,但会在一次打印一条警告,指示该消息已被消耗,并且此特定记录器是错误的。