gpt4 book ai didi

Python:设置日志记录,允许多行字符串:logging.info ('foo\nbar' )

转载 作者:太空狗 更新时间:2023-10-30 00:34:12 25 4
gpt4 key购买 nike

到目前为止,我只对文件进行简单的日志记录,如果我记录多行字符串,那么结果如下所示:

发出日志:

logging.info('foo\nbar') 

日志文件:

2018-03-05 10:51:53 root.main +16: INFO     [28302] foo

酒吧

到目前为止,所有不包含“INFO”或“DEBUG”的行都会报告给运算符(operator)。

这意味着 bar 行被报告。这是误报。

环境:Linux。

如何在 Python 中设置日志记录以将 INFO foo\nbar 保留在一个字符串中并忽略整个字符串,因为它只是“INFO”?

注意:是的,您可以在解释器中过滤日志记录。不幸的是,这不是问题所在。这个问题是不同的。首先发生日志记录。然后解析日志。

这是一个重现它的脚本:

import sys
import logging


def set_up_logging(level=logging.INFO):
root_logger = logging.getLogger()
root_logger.setLevel(level)
handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(
logging.Formatter('%(asctime)s %(name)s: %(levelname)-8s [%(process)d] %(message)s', '%Y-%m-%d %H:%M:%S'))
root_logger.addHandler(handler)


def main():
set_up_logging()
logging.info('foo\nbar')


if __name__ == '__main__':
main()

再想一想,我觉得真正的问题是:哪种日志记录格式可行?仅仅删除跨越多行的消息中的换行符会使一些输出难以被人眼阅读。另一方面,当前 logging.info() 与日志文件中的一行之间的 1:1 关系很容易阅读。 ...我不确定

最佳答案

我通常有一个自定义日志记录的类,但您可以使用自定义 logging.Formatter 实现您想要的:

import logging

class NewLineFormatter(logging.Formatter):

def __init__(self, fmt, datefmt=None):
"""
Init given the log line format and date format
"""
logging.Formatter.__init__(self, fmt, datefmt)


def format(self, record):
"""
Override format function
"""
msg = logging.Formatter.format(self, record)

if record.message != "":
parts = msg.split(record.message)
msg = msg.replace('\n', '\n' + parts[0])

return msg

上面的 format() 函数拆分行并在每行中复制时间戳/日志前导码(在每个 \n 之后)

现在您需要将格式化程序附加到根记录器。如果您构建自己的日志记录设置/结构,您实际上可以将它附加到任何 handler:

# Basic config as usual
logging.basicConfig(level=logging.DEBUG)

# Some globals/consts
DATEFORMAT = '%d-%m-%Y %H:%M:%S'
LOGFORMAT = '%(asctime)s %(process)s %(levelname)-8s %(filename)15s-%(lineno)-4s: %(message)s'

# Create a new formatter
formatter = NewLineFormatter(LOGFORMAT, datefmt=DATEFORMAT)

# Attach the formatter on the root logger
lg = logging.getLogger()

# This is a bit of a hack... might be a better way to do this
lg.handlers[0].setFormatter(formatter)


# test root logger
lg.debug("Hello\nWorld")

# test module logger + JSON
lg = logging.getLogger("mylogger")
lg.debug('{\n "a": "Hello",\n "b": "World2"\n}')

上面给你:

05-03-2018 08:37:34 13065 DEBUG     test_logger.py-47  : Hello
05-03-2018 08:37:34 13065 DEBUG test_logger.py-47 : World
05-03-2018 08:37:34 13065 DEBUG test_logger.py-51 : {
05-03-2018 08:37:34 13065 DEBUG test_logger.py-51 : "a": "Hello",
05-03-2018 08:37:34 13065 DEBUG test_logger.py-51 : "b": "World2"
05-03-2018 08:37:34 13065 DEBUG test_logger.py-51 : }

请注意,我正在访问根记录器的 .handlers[0],这有点麻烦,但我找不到解决这个问题的方法...另外,请注意格式化JSON 打印:)

关于Python:设置日志记录,允许多行字符串:logging.info ('foo\nbar' ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49049044/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com