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

est*_*est 29 python logging newline

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')
Run Code Online (Sandbox Code Playgroud)

11:15:01 INFO你好
11:16:49警告
 新招呼你好

因为日志很拥挤,我想在之前 asctime之前显式插入换行符levelname.这可能没有修改format吗?

我查看了logging模块并搜索了一下,找不到可行的方法.

Hai*_* Vu 32

我有两个解决方案,第一个很容易,但输出不是很干净.第二种方法将产生您想要的确切输出,但它涉及更多一点.

方法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')
Run Code Online (Sandbox Code Playgroud)

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

16:07:26 INFO你好
16:07:26信息

16:07:26警告新的你好

方法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')
Run Code Online (Sandbox Code Playgroud)

输出是你想看到的:

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

logging_test INFO    : Finish updating records
Run Code Online (Sandbox Code Playgroud)

讨论

  • 如果你能忍受不太完美的输出,方法1就是你要走的路.它具有简单,省力的优点.
  • 第二种方法正确地完成了工作,但它有点牵扯.它创建了两个不同的处理程序并切换它们以实现您的目标.
  • 使用方法2的另一个缺点是您必须通过搜索logging并替换它们来更改代码logger.您必须小心,只更换相关部件,并留下相应的文字logging.DEBUG.


小智 8

你能不能在第一次问候后添加换行符?即

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

哪个会输出

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

2014-08-06 11:37:24,061 INFO    : new hello
Run Code Online (Sandbox Code Playgroud)

  • 我以为这也是起初很明显的解决方案,但是空行将取决于日志记录级别。 (3认同)

Vin*_*jip 7

使用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)
Run Code Online (Sandbox Code Playgroud)

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


小智 5

插入我想出的换行符的最简单方法:

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

11:50:32 信息
你好
11:50:32 信息
新你好

  • 这将在 python 3.6.1 中逐字显示 `\n\r` (3认同)