【问题标题】:Python: Warnings and logging verbose limitPython:警告和记录详细限制
【发布时间】:2009-09-13 12:41:25
【问题描述】:

我想统一我的应用程序的整个日志记录工具。任何警告都会引发异常,接下来我会捕获它并将其传递给记录器。但问题是:记录中是否有任何静音设施?有时记录器变得过于冗长。有时由于过于嘈杂的警告,警告是否有任何详细限制?

http://docs.python.org/library/logging.html

http://docs.python.org/library/warnings.html

【问题讨论】:

    标签: python logging warnings


    【解决方案1】:

    不仅有log levels,还有一个非常灵活的way of configuring them。如果您使用命名为 logger 的对象(例如,logger = logging.getLogger(...)),那么您可以适当地配置它们。这将允许您在逐个子系统的基础上配置详细程度,其中 子系统 由日志记录层次结构定义。

    另一个选项是使用logging.FilterWarning filters 来限制输出。我以前没有使用过这种方法,但看起来它可能更适合您的需求。

    阅读PEP-282 以获得对 Python logging 包的良好散文描述。我认为它比模块文档更好地描述了功能。

    澄清后编辑

    您可以使用基于logging.Logger 并在logging.setLoggerClass() 注册的自定义类来处理此日志记录部分。听起来您确实想要类似于 syslog 的“最后一条消息重复 9 次”。不幸的是,我不知道任何地方的实现。您可能想看看twisted.python.log 是否支持此功能。

    【讨论】:

    • 我的问题表述不当,我需要设置详细限制,以使记录器在达到指定的静音限制后关闭。
    【解决方案2】:

    来自您提到的来源。 有日志级别,请明智地使用 ;-)

    LEVELS = {'debug': logging.DEBUG,
              'info': logging.INFO,
              'warning': logging.WARNING,
              'error': logging.ERROR,
              'critical': logging.CRITICAL}
    

    【讨论】:

    • 我说的是稍微不同的东西。我想在 N 条相等的消息后使记录器静音。
    【解决方案3】:

    如果您计划从某个对引发错误的代码一无所知的盲目错误处理程序进行所有日志记录调用,这将是一个问题,这就是您的问题。您将如何决定进行哪些记录调用,哪些不进行?

    更标准的做法是尽可能使用此类块进行恢复,并记录错误(实际上,如果这是您没有专门准备的错误,您想了解它;使用高级别) .但是不要依赖这些块来获取所有状态/调试信息。最好在代码到达错误处理程序之前将其与日志调用一起使用。这样,您可以在系统未发生故障时观察有关系统的有用运行时信息,并且可以进行不同严重程度的记录调用。例如:

    import logging
    from traceback import format_exc
    logger = logging.getLogger() # Gives the root logger.  Change this for better organization
    # Add your appenders or what have you
    def handle_error(e):
        logger.error("Unexpected error found")
        logger.warn(format_exc()) #put the traceback in the log at lower level
        ... #Your recovery code
    def do_stuff():
        logger.info("Program started")
        ... #Your main code
        logger.info("Stuff done")
    if __name__ == "__main__":
        try:
            do_stuff()
        except Exception,e:
            handle_error(e)
    

    【讨论】:

    • 问题不在日志级别!我不知道如何实现详细限制。如何禁止打印数百条类似消息并仅打印前几条?
    猜你喜欢
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 2011-06-15
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    相关资源
    最近更新 更多