我想在模块中包含日志记录,但我不希望模块创建新的日志对象/文件,我希望它使用调用者日志对象,无论可能是什么,但只有当他们通过一个。我知道我可以将所有日志调用放在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')
做这样的事情有什么更好的方式?
谢谢!
答案 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 输出,但会在一次打印一条警告,指示该消息已被消耗,并且此特定记录器是错误的。