如何使用python日志记录模块打印多行日志?

时间:2017-07-20 13:55:22

标签: python python-2.7 python-3.x logging

我想使用python日志记录模块创建多行记录器。当我使用下面的代码片段格式化记录器时:

import logging
logger = logging.getLogger(file_name)
logger.setLevel(logging.DEBUG)
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
logger.addHandler(ch)

当我使用 logger.info(“”“line 1 \ nline 2 \ n line 3”“”)

2017-07-20 13:21:14,754 - my_logger.py - INFO - line 1
line 2
line 3

我想要输出如下:

2017-07-20 13:21:14,754 - my_logger.py - INFO - line 1
2017-07-20 13:21:14,754 - my_logger.py - INFO - line 2
2017-07-20 13:21:14,754 - my_logger.py - INFO - line 3

3 个答案:

答案 0 :(得分:2)

您可以创建自己的格式化程序:

import logging
class MultilineFormatter(logging.Formatter):
    def format(self, record: logging.LogRecord):
        save_msg = record.msg
        output = ""
        for line in save_msg.splitlines():
            record.msg = line
            output += super().format(record) + "\n"
        record.msg = save_msg
        record.message = output
        return output

如下修改记录器初始化:

formatter = MultilineFormatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

答案 1 :(得分:0)

简短的回答,你不能。您可以做的事情如下:

logger.info('line 1')
logger.info('line 2')
logger.info('line 3')

或者,如果你有多行内容,你可以这样做:

map(logger.info, 'line 1\nline 2\nline 3'.split('\n'))

这些不会同时出现,但会非常接近......

答案 2 :(得分:0)

如果我仅使用单个日志级别(警告或信息或类似级别),则我更喜欢使用助手功能来做到这一点:

def multiline_warning(header, body):
  for line in body.splitlines():
    logging.warning(f"{header}: {line}")

在上下文中,只需调用:

multiline_warning("stderr", subprocess_result.stderr)

如果使用的不只一种(严重,错误,警告,信息或调试),则可以提取日志级别并将其作为参数传递,并改用logging.log。