将 python 日志格式应用于包含新行的消息的每一行

Mar*_*kNS 3 python logging

我想在日志文件中包含与每个日志行的请求相关联的 id 。我有通过日志过滤器检索请求 ID 的机制,工作正常。

我的问题是,当日志行包含换行符时,该行当然会被包裹到“裸”行上。有没有办法告诉日志库拆分消息,并将格式应用于拆分的每个元素?

import logging

logger = logging.getLogger()
handler = logging.StreamHandler()
formatter = logging.Formatter(
        "%(requestid)s\t%(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)

logger.debug("blah\nblah")
Run Code Online (Sandbox Code Playgroud)

输出:

xxx blah
blah
Run Code Online (Sandbox Code Playgroud)

期望的输出:

xxx blah
xxx blah
Run Code Online (Sandbox Code Playgroud)

Sid*_*pta 8

尽管这不是解决此问题的最佳方法,但是这将有助于您无需更改大量代码。

import logging


class CustomHandler(logging.StreamHandler):
    def __init__(self):
        super(CustomHandler, self).__init__()

    def emit(self, record):
        messages = record.msg.split('\n')
        for message in messages:
            record.msg = message
            super(CustomHandler, self).emit(record)


log = logging.getLogger()
handler = CustomHandler()
formattor = logging.Formatter("xxx:%(message)s")

handler.setFormatter(formattor)

log.addHandler(handler)
log.setLevel(logging.DEBUG)

if __name__ == '__main__':
    log.debug('hello\nhi')
Run Code Online (Sandbox Code Playgroud)

输出:

xxx:hello
xxx:hi
Run Code Online (Sandbox Code Playgroud)