我正在尝试设置日志记录,我可以在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'}, {...}, {...}]
这可行吗?我知道我可以在我的流程完成后发布处理这个日志文件,但我正在寻找一个更优雅的解决方案,因为我记录的某些东西本身就是很大的对象。
答案 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的部分。
其他位(多个处理程序),您已经知道了。