如何在python日志中插入换行符?

2024-09-28 17:20:45 发布

您现在位置:Python中文网/ 问答频道 /正文

import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s %(message)s', datefmt='%H:%M:%S')
logging.info('hello')
logging.warning('\n new hello')

11:15:01 INFO hello
11:16:49 WARNING
 new hello

由于日志很拥挤,我想在asctimelevelname之前显式插入一个新行。不修改format这可能吗?

我查看了一下logging模块,然后在谷歌上搜索了一下,找不到可行的方法。


Tags: debugimportinfoformatmessagehellonewlogging
3条回答

我有两个解决方案,第一个很简单,但输出不是很干净。第二种方法将产生您想要的确切输出,但它稍微复杂一些。

方法1

要生成空行,只需用新行记录空字符串:

import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s %(message)s', datefmt='%H:%M:%S')
logging.info('hello')
logging.info('\n')
logging.warning('new hello')

输出将有一个空的信息行,它不是很干净:

16:07:26 INFO hello
16:07:26 INFO

16:07:26 WARNING new hello

方法2

在这个方法中,我创建了两个不同的处理程序。我经常使用的console_handler。当需要新行时,我切换到第二个处理程序blank_handler

import logging
import types

def log_newline(self, how_many_lines=1):
    # Switch handler, output a blank line
    self.removeHandler(self.console_handler)
    self.addHandler(self.blank_handler)
    for i in range(how_many_lines):
        self.info('')

    # Switch back
    self.removeHandler(self.blank_handler)
    self.addHandler(self.console_handler)

def create_logger():
    # Create a handler
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.DEBUG)
    console_handler.setFormatter(logging.Formatter(fmt="%(name)s %(levelname)-8s: %(message)s"))

    # Create a "blank line" handler
    blank_handler = logging.StreamHandler()
    blank_handler.setLevel(logging.DEBUG)
    blank_handler.setFormatter(logging.Formatter(fmt=''))

    # Create a logger, with the previously-defined handler
    logger = logging.getLogger('logging_test')
    logger.setLevel(logging.DEBUG)
    logger.addHandler(console_handler)

    # Save some data and add a method to logger object
    logger.console_handler = console_handler
    logger.blank_handler = blank_handler
    logger.newline = types.MethodType(log_newline, logger)

    return logger

if __name__ == '__main__':
    logger = create_logger()
    logger.info('Start reading database')
    logger.info('Updating records ...')
    logger.newline()
    logger.info('Finish updating records')

输出是您想要看到的:

logging_test INFO    : Start reading database
logging_test INFO    : Updating records ...

logging_test INFO    : Finish updating records

讨论

  • 如果你能忍受不太完美的输出,那么方法1就是方法。它的优点是简单、省力。
  • 第二种方法正确地完成了任务,但是它有点复杂。它创建两个不同的处理程序,并切换它们以实现您的目标。
  • 使用方法2的另一个缺点是必须通过搜索logging并用logger替换它们来更改代码。您必须注意只替换相关部分,并保留诸如logging.DEBUG这样的文本。

使用在不同时间使用不同格式字符串的自定义Formatter。您不能使用basicConfig()来完成这项工作-您必须使用loggingAPI的其他部分。

class MyFormatter(logging.Formatter):
    def format(self, record):
        # set self._fmt to value with or without newline,
        # as per your decision criteria
        # self._fmt = ...
        return super(MyFormatter, self).format(record)

或者,可以调用super方法,然后修改字符串以在返回新行之前插入新行(例如,如果它依赖于行长度)。

你不能在第一次打招呼后加上新行吗?i、 e

logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s %(message)s', datefmt='%H:%M:%S')
logging.info('hello\n')
logging.info('new hello')

它将输出

2014-08-06 11:37:24,061 INFO    : hello

2014-08-06 11:37:24,061 INFO    : new hello

相关问题 更多 >