【发布时间】:2022-01-29 14:01:56
【问题描述】:
我正在使用 json jsonlogger.JsonFormatter 编写 json 日志文件,如下所示(只是提取了代码的重要部分)。对于控制台,我使用普通的StreamHandler。
在程序执行期间,我在字典中收集一些统计信息,在程序完成时记录这些统计信息。我使用pformat 来获得更易于阅读的输出,这在控制台streamHandler 上运行良好。
from pprint import pformat
logger.info(pformat(stats_dict, indent=2, sort_dicts=False))
带有 pformat 的 dict 的控制台输出:
2022-01-29 13:53:43 [INFO ] extractor
{ 'search_count': 240,
'no_response': 0,
'no_result': 8}
但这也会导致 json 格式化程序 无法正确识别字典的键/值元组,而是整个字典将在 message 键中显示为单个字符串值,包括\n 来自 pformat:
{"asctime": "2022-01-29 13:17:41,430", "levelname": "INFO", "levelno": 20, "module": "extractor", "message": "{ 'search_count': 240,\n 'no_response': 0,\n 'no_result': 8,\n }", "lineno": 463}
如果我不使用pformat,那么 json 文件处理程序将正确识别所有键/值元组并将它们记录下来。
{"asctime": "2022-01-29 13:53:43,487", "levelname": "INFO", "levelno": 20, "module": "extractor", "message": null, "lineno": 464, "search_count": 240, "no_response": 0, "no_result": 8}
这是设置我的处理程序的部分:
from pythonjsonlogger import jsonlogger
def get_json_handler(file_base, path, level):
path = os.path.join(path, '')
logfilename = file_base + "_" + level.lower() + ".json"
json_handler = logging.handlers.TimedRotatingFileHandler(f"{path}{logfilename}", when="midnight", interval=1, backupCount=3)
format = jsonlogger.JsonFormatter("%(asctime)s %(levelname)s %(levelno)s %(module)s %(message)s %(lineno)s ")
json_handler.setLevel(level)
json_handler.setFormatter(format)
return json_handler
def get_stream_handler(level):
stream_handler = logging.StreamHandler()
format = logging.Formatter("%(asctime)s [%(levelname)-7s] %(module)-12s %(message)s", "%Y-%m-%d %H:%M:%S")
stream_handler.setLevel(level)
stream_handler.setFormatter(format)
return stream_handler
有没有一种简单的方法可以去除 json 格式化程序 本身中 pformat 放置的 \n 换行符?
【问题讨论】: