【发布时间】:2018-03-01 11:45:43
【问题描述】:
到目前为止,我对文件进行了简单的日志记录,如果我记录了多行字符串,则结果如下所示:
发出日志:
logging.info('foo\nbar')
日志文件:
2018-03-05 10:51:53 root.main +16: INFO [28302] foo
酒吧
到目前为止,所有不包含“INFO”或“DEBUG”的行都会报告给操作员。
这意味着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.basicConfig(..一样,还可以显示您想要的不同日志级别的输出到底是什么? -
@Chris_Rands 我添加了一个脚本来重现它。你的问题“你想要的输出到底是什么?”非常好。我没有任何线索。到目前为止,我们解析日志文件并假设每一行都是一个日志条目。我想目前的模式不再可行。什么是最简单、理智、最 Pythonic 的解决方案?
-
我在想(对我来说很少见:)) - 你用什么来解析日志?增强该部分可能更容易且更一致,特别是如果您不想修改 python 源代码。例如,在我下面的解决方案中,您最终可能会收到 2 个或更多警报,其中没有一个包含完整消息! (取决于解析器的工作方式)。不过,这需要一个单独的问题...
-
您可以使用
logging.info(json.dumps(message)),它将返回一个包含转义换行符的字符串。或者,您可以创建一个自动执行此操作的自定义Formatter类。