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

时间:2016-07-19 12:15:15

标签: 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")

输出:

xxx blah
blah

期望的输出:

xxx blah
xxx blah

2 个答案:

答案 0 :(得分:4)

虽然这不是解决此问题的最佳方式,但这可以帮助您而无需更改大量代码。

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

输出:

xxx:hello
xxx:hi

答案 1 :(得分:1)

而不是:

String nameOfDay

您可以使用

message = "blah\nblah"
logger.debug(message)

这里的原则是每个模块都应该有自己的责任。如果记录器有责任为每条消息添加ID,则呼叫者有责任(即#34;你的")为其提供正确的分区消息。