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
,这表明我不理解asctime
和message
是如何定义的。谢谢
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)
将其注册到记录器的恶作剧。