4

我设置了一个记录器。像这样的东西:

def initLogger(self):
    self.logger = logging.getLogger('MyApp')
    if not self.logger.handlers:
        hdlr = logging.FileHandler('MyApp.log')
        formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
        hdlr.setFormatter(formatter)
        self.logger.addHandler(hdlr)
        self.logger.setLevel(logging.WARNING)

我想在程序启动时总是在日志中打印一行。但是,我不想将其记录为警告。我只想始终有一个标记执行开始的痕迹。我知道我可以将级别切换到 INFO 或 DEBUG 并调用 self.logger.info("Program start"),但这看起来很混乱。无论记录器级别如何,有没有办法强制输出?

谢谢

4

3 回答 3

3

我不确定这是否会被认为是对日志系统的滥用,但以下情况如何:

logging.addLevelName(100, 'INFO')
logging.log(100, 'Program Start')

这导致:

2018-03-06 17:01:29:INFO:root:Program Start

最高预定义级别CRITICAL的值为 50,因此使用 100 作为我们的假INFO级别应该足以确保无论当前日志级别如何,它始终出现在日志中。

(如果您愿意为级别 100 指定一个不同的名称,例如,START如果您认为INFO当日志级别高于该级别时出现一条消息很奇怪。)

于 2018-03-06T17:04:46.073 回答
2

想到的最简单的方法是在添加格式化程序和处理程序之后,但在设置记录器级别之前写入日志消息。如果日志系统完全由您的程序配置,那么在您明确设置之前不会设置任何记录器级别,因此在您设置级别之前将记录所有消息。

另一种方法是安装过滤器而不是设置日志级别。过滤器可以拒绝低于特定级别的所有消息,除非消息与指定的模式匹配,或者直到您调用过滤器上的方法将其打开,或类似的事情。但是,这样做会牺牲一些效率;的标准实现Logger是在调用任何日志记录方法时立即检查级别,如果消息级别不够高则丢弃该消息,而过滤器将在该过程的后期检查。

如果您的代码之外的其他东西已经将记录器级别设置为WARNING,而您无法控制它,那么真的没有办法解决它。您将不得不临时重置记录器级别(如果您不使用顶级记录器,这可能会变得混乱,因为您必须检查并重置多个“代”记录器的级别),或者安装您自己的自定义Logger子类在创建任何记录器之前。在这种情况下,我想说检查日志系统是否正常工作可能不是您的责任。

于 2013-09-04T19:31:12.467 回答
0

您可以打开文件,将启动消息写入其中,然后将其作为流传递给StreamHandler.

于 2013-09-04T23:53:51.227 回答