设置高级Python日志记录

时间:2012-02-09 12:38:39

标签: python logging

我想对我的模块使用日志记录,但我不确定如何设计以下要求:

  • 正常的日志记录级别(信息,错误,警告,调试)以及一些其他更详细的调试级别
  • 日志消息可以有不同的类型;一些是供开发人员使用的,一些是供用户使用的;那些类型转到不同的输出
  • 错误应转到stderr
  • 我还需要跟踪哪个模块/功能/代码行编写了调试消息,以便我可以在配置中激活或停用单个调试消息
  • 我需要跟踪是否发生错误,最终在程序结束时执行sys.exit()
  • 在设置记录器之前,所有消息都应转到stdout

我已经阅读了日志文档,但我不确定使用日志模块的最简化方法是什么(如何使用Logger,Handler,Filter等的概念)。你能指出一个想法来设置它吗? (例如,使用两个记录器'user','developer'编写模块;从Logger派生;执行getLogger(__name__);保留这样的错误标志,等等。)

1 个答案:

答案 0 :(得分:9)

1)添加更详细的调试级别。

你有没有想过这个?

了解doc所说的内容:

  

可以定义您自己的等级,但不应该是必要的,因为现有等级是根据实际经验选择的。但是,如果您确信需要自定义级别,那么应该非常小心,并且如果您正在开发库,那么定义自定义级别可能是一个非常糟糕的主意< / strong>即可。这是因为如果多个库作者都定义了他们自己的自定义级别,那么使用开发人员很难控制和/或解释这些多个库的日志记录输出,因为给定的数值可能意味着不同的东西对于不同的图书馆。

另请参阅When to use logging,有两个非常好的表格,说明何时使用这些内容。

无论如何,如果您认为您需要额外的日志记录级别,请查看:logging.addLevelName()

2)开发人员的一些日志消息,以及用户的一些日志消息

使用具有不同处理程序的不同记录器系列。在每个家庭的基础上设置Logger.propagateFalse

3)错误应该转到stderr

默认情况下,这已经发生在StreamHandler

  

class logging.StreamHandler(stream = None)

     
    

返回StreamHandler类的新实例。如果指定了stream,则实例将使用它来记录输出;否则,将使用 sys.stderr

  

4)跟踪日志消息的来源

使用不同的名称获取记录器,并使用%(name)s使用格式字符串stdout

5)所有消息都应转到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}}