python中的条件日志记录

python中的条件日志记录,python,logging,Python,Logging,我希望在模块中包含日志记录,但我不希望该模块创建新的日志对象/文件,我希望它使用调用者日志对象,不管它是什么,但前提是调用者传递了一个日志对象。我知道我可以把所有的日志调用放在一个try块中,但这很尴尬。我最后想到的似乎是可行的,但它似乎相当混乱,我相信有更好的方法来做到这一点 class MyClass(object): def __init__(self, arg1, arg2, log=None): if log == None: class

我希望在模块中包含日志记录,但我不希望该模块创建新的日志对象/文件,我希望它使用调用者日志对象,不管它是什么,但前提是调用者传递了一个日志对象。我知道我可以把所有的日志调用放在一个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')
做这样的事情有什么更好的方法


谢谢

直接使用
日志记录
模块提供的功能,即:

logging.debug('Starting')

并让调用者自行更改根记录器(如果他们愿意)

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

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

首选模式:

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")
编辑:标准的
日志记录
模块实际上做了所有正确的事情,包括什么都没有

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')
>>> 

请注意,绝对不会出现任何输出,只会打印一次警告,以指示消息已被使用,并且该特定记录器是错误的

我觉得它相当不错。只需将您的日志类放入一个单例中,并将其称为NoneLog或类似的名称,以减少使用它的每个类中的代码。我不这么认为。如果他们没有传递日志对象,这将如何工作?日志模块是标准库的一部分,不需要向每个导入的模块传递自定义日志对象。我想我要么遗漏了什么,要么没有说清楚。我正在写的课程会被其他人使用,我无法控制他们的工作。如果他们设置了日志记录,我想记录消息,但如果他们没有设置日志文件,我不想转储到stdout(我相信会这样)。你的方法会促进这一点吗?