如何使用python的str.format在logging.basicConfig()中定义格式?



Python文档教授以下语法:

import logging
logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
logging.warning('is when this event was logged.')

我想用python str.format来表达format='%(asctime)s %(message)s'。我该怎么做?

我尝试过,但返回了NameError,这表明我不理解asctimemessage是如何定义的。谢谢

File "~/test.py", line 163, in main
format='{}{}'.format(asctime,message),
NameError: name 'asctime' is not defined

它看起来像这样:

import logging
logging.basicConfig(level=logging.INFO, format="{asctime} {message}", style='{')
logging.info('hello world')

基本上,与上面的%样式插值字符串类似的.format'{asctime} {message}'。然后,唯一要做的就是告诉记录器使用"{"样式的格式字符串,而不是"%"样式的字符串。

请注意,在您的单个日志消息中使用.format风格的字符串并不是一件小事——例如,以下内容不起作用:

logging.info("hello {}", "world")

在整个应用程序中使用特定的格式样式中对此进行了详细描述(以及解决方法(。

它的要点是,您可以将任何对象传递给logging.info——python将在其上调用str

class LogStr:
def __init__(self, msg, *args, **kwargs):
self.msg = msg
self.args = args
self.kwargs = kwargs
def __str__(self):
return self.msg.format(*args, **kwargs)
logging.info(LogStr("Hello {}", "world"))

或者,您可以经历定义一个LogRecord接口兼容对象(可能通过子类化(并通过logger.setLogRecordFactory(MyLogRecord)将其注册到记录器的恶作剧。

最新更新