力线输出记录器

2024-04-23 14:25:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我安排了一个记录器。像这样:

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和callself.logger.info(“程序启动”),但这看起来很混乱。有没有一种方法可以强制输出而不考虑记录器级别?在

谢谢


Tags: self程序ifformatterlogginghandlersdefnot
3条回答

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

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

这将导致:

^{pr2}$

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

(如果您喜欢给level 100一个不同的名称,比如START,如果您认为在日志级别高于该级别时出现INFO消息是很奇怪的,那么可以给level 100一个不同的名称,例如START

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

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

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

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

相关问题 更多 >