我有一个记录器设置。像这样:
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(“程序启动”),但这看起来很混乱。无论记录器级别如何,都有办法强制输出吗?
由于
答案 0 :(得分:2)
最简单的方法是在添加格式化程序和处理程序之后,但在设置记录器级别之前编写日志消息。如果日志系统完全由您的程序配置,那么在您明确设置日志记录系统之前,任何记录器都不会设置级别,因此在您设置级别之前将记录所有消息。
另一种方法是安装过滤器而不是设置日志级别。过滤器可以拒绝低于某个级别的所有消息,除非消息与指定的模式匹配,或者直到您调用过滤器上的方法来打开它,或者某些此类事件。通过这样做,你牺牲了一点效率; Logger
的标准实现是为了在调用任何日志记录方法时立即检查级别而构建的,如果消息不在足够高的级别,则丢弃该消息,而在此过程中稍后检查过滤器。
如果您的代码之外的其他内容已经将记录器级别设置为WARNING
,并且您无法控制它,那么实际上没有办法解决它。您必须暂时重置记录器级别(如果您不使用顶级记录器,则可能会变得混乱,因为您必须检查并重置多个“几代”记录器的级别),或者安装您自己的自定义{创建任何记录器之前的{1}}子类。在这种情况下,我会说你无需检查日志记录系统是否正常工作。
答案 1 :(得分:1)
我不确定这是否会被视为滥用日志系统,但以下内容如何:
logging.addLevelName(100, 'INFO')
logging.log(100, 'Program Start')
这导致:
2018-03-06 17:01:29:INFO:root:Program Start
最高预定义级别CRITICAL
的值为50,因此对于我们的假INFO
级别使用100应足以确保它始终显示在日志中,而不管当前日志如何水平。
(如果您认为在日志级别高于此值时出现START
消息很奇怪,您可以选择给级别100另一个名称,例如INFO
。
答案 2 :(得分:0)
您可以打开文件,将启动消息写入其中,然后将其作为流传递给StreamHandler
。