Python以字典或JSON格式登录文件

时间:2018-05-02 22:49:03

标签: python logging

我正在尝试设置日志记录,我可以在stdout和文件中登录。我使用以下代码完成了这项工作:

logging.basicConfig(
        level=logging.DEBUG, format='%(asctime)-15s %(levelname)-8s %(message)s',
        datefmt='%a, %d %b %Y %H:%M:%S', handlers=[logging.FileHandler(path), logging.StreamHandler()])

这样的输出:

2018-05-02 18:43:33,295 DEBUG    Starting new HTTPS connection (1): google.com
2018-05-02 18:43:33,385 DEBUG    https://google.com:443 "GET / HTTP/1.1" 301 220
2018-05-02 18:43:33,389 DEBUG    Starting new HTTPS connection (1): www.google.com
2018-05-02 18:43:33,490 DEBUG    https://www.google.com:443 "GET / HTTP/1.1" 200 None

我想要完成的是将此输出记录到文件而不是打印到stdout,而是作为类似于此类的字典或JSON对象(同时保持stdout):< / p>

[{'time': '2018-05-02 18:43:33,295', 'level': 'DEBUG', 'message': 'Starting new HTTPS connection (1): google.com'}, {...}, {...}]

这可行吗?我知道我可以在我的流程完成后发布处理这个日志文件,但我正在寻找一个更优雅的解决方案,因为我记录的某些东西本身就是很大的对象。

3 个答案:

答案 0 :(得分:1)

基于@abarnert,我发现这个Link提供了一个很好的途径来使这个概念在大多数情况下起作用。目前的代码是:

with open('foo.log') as f:
    logs = f.read().splitlines()
for l in logs:
    for key, value in eval(l):
        do something ...

虽然它不完全符合要求,但它不需要任何预处理,并允许我创建两个日志处理程序。

之后,我可以使用类似的东西:

dict

拉取ptref = Partdocument.Part.CreateReferenceFromObject(pt1) 'creating reference from point refline = Partdocument.Part.CreateReferenceFromObject(line1) 'creating reference from line 个对象,而不是使用格式不正确的JSON来完成我想要完成的任务。

仍然希望有一个更优雅的解决方案。

答案 1 :(得分:1)

使用此代码,您可以将完整的追溯,时间戳和级别添加到所选的json文件中。

[
    {
        "timestamp": "09/06/2020 17:38:00",
        "level": "error",
        "traceback": "Traceback (most recent call last):\n  File \"d:testFullTraceback.py\", line 19, in <module>\n    print(5/0)\nZeroDivisionError: division by zero\n"
    }
]

输出:

{{1}}

答案 2 :(得分:0)

该食谱专门展示了如何格式化结构化日志记录,请参阅标题为Implementing Structured Logging的部分。

其他位(多个处理程序),您已经知道了。