我想对我的模块使用日志记录,但我不确定如何设计以下要求:
stderr
sys.exit()
stdout
我已经阅读了日志文档,但我不确定使用日志模块的最简化方法是什么(如何使用Logger,Handler,Filter等的概念)。你能指出一个想法来设置它吗? (例如,使用两个记录器'user','developer'编写模块;从Logger
派生;执行getLogger(__name__)
;保留这样的错误标志,等等。)
答案 0 :(得分:9)
你有没有想过这个?
了解doc所说的内容:
可以定义您自己的等级,但不应该是必要的,因为现有等级是根据实际经验选择的。但是,如果您确信需要自定义级别,那么应该非常小心,并且如果您正在开发库,那么定义自定义级别可能是一个非常糟糕的主意< / strong>即可。这是因为如果多个库作者都定义了他们自己的自定义级别,那么使用开发人员很难控制和/或解释这些多个库的日志记录输出,因为给定的数值可能意味着不同的东西对于不同的图书馆。
另请参阅When to use logging,有两个非常好的表格,说明何时使用这些内容。
无论如何,如果您认为您需要额外的日志记录级别,请查看:logging.addLevelName()
。
使用具有不同处理程序的不同记录器系列。在每个家庭的基础上设置Logger.propagate
到False
。
stderr
默认情况下,这已经发生在StreamHandler
:
class logging.StreamHandler(stream = None)
返回StreamHandler类的新实例。如果指定了stream,则实例将使用它来记录输出;否则,将使用 sys.stderr 。
使用不同的名称获取记录器,并使用%(name)s
使用格式字符串stdout
。
print
,直到记录器设置您的日志记录系统的设置应该是最先做的事情之一,所以我真的不明白这意味着什么。如果您需要将消息发送到stdout,请使用# at the very beginning
root = logging.getLogger()
fallback_handler = logging.StreamHandler(stream=sys.stdout)
root.addHandler(fallback_handler)
# first.py
first_logger = logging.getLogger('first')
first_logger.parent = False
# ... set 'first' logger as you wish
class Foo:
def __init__(self):
self.logger = logging.getLogger('first.Foo')
def baz(self):
self.logger.info("I'm in baz")
# second.py
second_logger = logging.getLogger('first.second') # to use the same settings
# third.py
abstract_logger = logging.getLogger('abs')
abstract_logger.parent = False
# ... set 'abs' logger
third_logger = logging.getLogger('abs.third')
# ... set 'abs.third' particular settings
# fourth.py
fourth_logger = logging.getLogger('abs.fourth')
# [...]
,因为它应该已经在Formatter中进行了解释。
最后的建议:仔细阅读When to use logging,因为它很好地涵盖了您的需求。
我不会在第一时间过滤,文件管理器很难维护,如果它们都在一个地方,那么该地方将需要保存太多信息。每个模块都应该使用或不使用其父设置来设置自己的Logger(使用自己的处理程序或过滤器)。
很快的例子:
{{1}}