gpt4 book ai didi

python - Python 中的多行日志记录

转载 作者:太空狗 更新时间:2023-10-29 17:32:51 25 4
gpt4 key购买 nike

我正在使用 Python 3.3.5 和日志记录模块将信息记录到本地文件(来自不同线程)。在某些情况下,我想输出一些额外的信息,但不知道这些信息到底是什么(例如,它可能是一行文本或一个字典)。

我想做的是在写入日志记录后将此附加信息添加到我的日志文件中。此外,仅当日志级别为错误(或更高)时才需要附加信息。

理想情况下,它看起来像:

2014-04-08 12:24:01 - INFO     - CPU load not exceeded
2014-04-08 12:24:26 - INFO - Service is running
2014-04-08 12:24:34 - ERROR - Could not find any active server processes
Additional information, might be several lines.
Dict structured information would be written as follows:
key1=value1
key2=value2
2014-04-08 12:25:16 - INFO - Database is responding

除了编写自定义日志格式化程序之外,我找不到太多符合我要求的东西。我读过有关过滤器和上下文的信息,但这似乎又不太合适。

或者,我可以只使用标准 I/O 写入文件,但大部分功能已经存在于日志记录模块中,而且它是线程安全的。

任何输入将不胜感激。如果确实需要自定义日志格式化程序,那么任何关于从哪里开始的指示都会很棒。

最佳答案

请记住,许多人认为多行日志消息是一种不好的做法(这是可以理解的,因为如果您有像 DataDog 或 Splunk 这样的日志处理器,它们非常适合处理单行日志,那么多行日志将是很难解析),您可以使用 extra 参数并使用自定义格式化程序将 stuff 附加到将要显示的消息中(查看在日志包 documentation 中使用 'extra'。

import logging

class CustomFilter(logging.Filter):
def filter(self, record):
if hasattr(record, 'dct') and len(record.dct) > 0:
for k, v in record.dct.iteritems():
record.msg = record.msg + '\n\t' + k + ': ' + v
return super(CustomFilter, self).filter(record)

if __name__ == "__main__":
logging.getLogger().setLevel(logging.DEBUG)
extra_logger = logging.getLogger('extra_logger')
extra_logger.setLevel(logging.INFO)
extra_logger.addFilter(CustomFilter())
logging.debug("Nothing special here... Keep walking")
extra_logger.info("This shows extra",
extra={'dct': {"foo": "bar", "baz": "loren"}})
extra_logger.debug("You shouldn't be seeing this in the output")
extra_logger.setLevel(logging.DEBUG)
extra_logger.debug("Now you should be seeing it!")

该代码输出:

DEBUG:root:Nothing special here... Keep walking
INFO:extra_logger:This shows extra
foo: bar
baz: loren
DEBUG:extra_logger:Now you should be seeing it!

我仍然建议在自定义过滤器中调用 superfilter 函数,主要是因为该函数决定是否显示消息(例如,如果您的记录器级别设置为 logging.INFO,并且您使用 extra_logger.debug 记录了一些内容,不应看到该消息,如上例所示)

关于python - Python 中的多行日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22934616/

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