Python中的多行日志记录

ƘɌỈ*_*ƬƠƑ 13 python logging python-3.x

我正在使用Python 3.3.5和日志记录模块将信息记录到本地文件(来自不同的线程).在某些情况下,我想输出一些额外的信息,而不知道该信息究竟是什么(例如,它可能是一行文字或一个字典).

我想要做的是在写完日志记录后将这些附加信息添加到我的日志文件中.此外,仅当日志级别为错误(或更高)时才需要附加信息.

理想情况下,它看起来像:

2014-04-08 12:24:01 - INFO     - CPU load not exceeded
2014-04-08 12:24:26 - INFO     - Service is running
2014-04-08 12:24:34 - ERROR    - Could not find any active server processes
Additional information, might be several lines.
Dict structured information would be written as follows:
key1=value1
key2=value2
2014-04-08 12:25:16 - INFO     - Database is responding
Run Code Online (Sandbox Code Playgroud)

如果没有编写自定义日志格式化程序,我找不到符合我要求的内容.我已经阅读了有关过滤器和上下文的内容,但这似乎并不是一个很好的匹配.

或者,我可以使用标准I/O写入文件,但是大部分功能已经存在于Logging模块中,而且它是线程安全的.

任何投入将不胜感激.如果确实需要自定义日志格式化程序,那么任何关于从哪里开始的指针都会非常棒.

小智 7

我只是\n 在输出文本中添加符号。

  • 遵循“日志记录手册”。使用 `str.format()` 样式作为模板而不是默认的基于 % 的样式 - 然后它将尊重特殊符号。 (4认同)
  • 如果我将日志格式化程序定义为 `lf = logging.Formatter('%(levelname)-8s - %(message)s\\n%(detail)s')` 并定义一个 `FileHandler` 将日志记录到文件,输出将包含 `\n` 而不是被转换为换行符。 (2认同)

Bor*_*jaX 7

请记住,许多人认为多行日志消息是一种不好的做法,您可以使用该extra属性并使用自定义格式化程序将内容附加到将要显示的消息上(请查看'extra的用法) '在日志包文档中).

import logging

class CustomFilter(logging.Filter):
    def filter(self, record):
        if hasattr(record, 'dct') and len(record.dct) > 0:
            for k, v in record.dct.iteritems():
                record.msg = record.msg + '\n\t' + k + ': ' + v
        return super(CustomFilter, self).filter(record)

if __name__ == "__main__":
    logging.getLogger().setLevel(logging.DEBUG)
    extra_logger = logging.getLogger('extra_logger')
    extra_logger.setLevel(logging.INFO)
    extra_logger.addFilter(CustomFilter())
    logging.debug("Nothing special here... Keep walking")
    extra_logger.info("This shows extra",
                      extra={'dct': {"foo": "bar", "baz": "loren"}})
    extra_logger.debug("You shouldn't be seeing this in the output")
    extra_logger.setLevel(logging.DEBUG)
    extra_logger.debug("Now you should be seeing it!")
Run Code Online (Sandbox Code Playgroud)

该代码输出:

DEBUG:root:Nothing special here... Keep walking
INFO:extra_logger:This shows extra
        foo: bar
        baz: loren
DEBUG:extra_logger:Now you should be seeing it!
Run Code Online (Sandbox Code Playgroud)

我还是建议调用superfilter函数在您的自定义过滤器,主要是因为这是决定是否显示消息或没有的功能(例如,如果你的日志级别设置为logging.INFO,并登录使用的东西extra_logger.debug,该消息不应该看到了,如上例所示)