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

如何使用python日志模块打印多行日志?,python,python-2.7,python-3.x,logging,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

我想使用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(““第1行\n第2行\n第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

简而言之,你不能。您可以执行以下操作:

logger.info('line 1')
logger.info('line 2')
logger.info('line 3')
或者,如果您有多行内容,您可以执行以下操作:

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

这些不会同时显示,但将非常接近…

简短回答,您不能。您可以执行以下操作:

logger.info('line 1')
logger.info('line 2')
logger.info('line 3')
或者,如果您有多行内容,您可以执行以下操作:

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

这些将不会同时显示,但将非常接近…

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

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')

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

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')

如果我只使用单个日志级别(警告或信息或类似),我更愿意使用帮助器函数来执行此操作:

def multiline_warning(header, body):
  for line in body.splitlines():
    logging.warning(f"{header}: {line}")
在上下文中,只需调用:

multiline_warning("stderr", subprocess_result.stderr)

如果只使用一个以上的日志级别(严重、错误、警告、信息或调试),您可能会提取日志级别并将其作为参数传递,然后改用logging.log。

如果我只使用一个日志级别(警告或信息或类似级别),我更愿意使用帮助器函数来执行此操作:

def multiline_warning(header, body):
  for line in body.splitlines():
    logging.warning(f"{header}: {line}")
在上下文中,只需调用:

multiline_warning("stderr", subprocess_result.stderr)

如果只使用其中一个以上(严重、错误、警告、信息或调试),您可能会提取日志级别并将其作为参数传递,然后改用logging.log。

是否有理由不能多次调用
logger.INFO()
?@Jakub我想为一个框架创建一个记录器,并希望使用这种格式化程序。有没有理由不能多次调用
logger.info()
?@Jakub我想为一个框架创建一个记录器,并希望使用这种格式化程序。