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

时间:2018-07-17 04:32:53

标签: python logging

Python documentation讲授以下语法:

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

1 个答案:

答案 0 :(得分:2)

它看起来像这样:

import logging

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

logging.info('hello world')

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

请注意,在您的各个日志消息中使用.format样式字符串并非易事-例如以下内容不起作用:

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

Using particular formatting styles throughout your application中对此进行了详细描述(以及变通方法)。

要点是,您可以将任何对象传递给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)向记录器注册的恶作剧。