Ich habe den JSON-Protokollformatierer verwendet, weil ich das Protokoll in JSON abrufen möchte, aber aus irgendeinem Grund ist Japanisch (Doppelbytezeichen) verstümmelt.
Windows10 Home 10.0.18362 Build 18362 Python 3.8.3 JSON-log-formatter 0.3.0
Führen Sie das folgende Programm aus.
json_log_test.py
import logging
import json_log_formatter
formatter = json_log_formatter.JSONFormatter()
json_handler = logging.FileHandler(filename='my-log.json', encoding='utf-8')#UTF-Ausgabe bei 8
json_handler.setFormatter(formatter)
logger = logging.getLogger('my_json')
logger.addHandler(json_handler)
logger.setLevel(logging.INFO)
logger.info('Diese Zeichenkette ist verstümmelt', extra={'extra': 'Diese Zeichenkette ist ebenfalls verstümmelt'})
Die Ausgabeprotokolldatei "my-log.json" lautet wie folgt. (Für einfache Anzeige geformt)
my-log.json
{
"extra": "\u3053\u306e\u6587\u5b57\u5217\u3082\u6587\u5b57\u5316\u3051\u3059\u308b",
"message": "\u3053\u306e\u6587\u5b57\u5217\u304c\u6587\u5b57\u5316\u3051\u3059\u308b",
"time": "2020-10-21T02:29:53.275011"
}
Das Extra und die Nachricht sind verstümmelt.
Schreiben Sie die "to_json" -Methode von "\ _ \ _ init__.py" im Verzeichnis "json_log_formatter" wie folgt um.
__init__.py
def to_json(self, record):
"""Converts record dict to a JSON string.
It makes best effort to serialize a record (represents an object as a string)
instead of raising TypeError if json library supports default argument.
Note, ujson doesn't support it.
Override this method to change the way dict is converted to JSON.
"""
try:
#return self.json_lib.dumps(record, default=_json_serializable)#Vor dem Umschreiben
return self.json_lib.dumps(record, ensure_ascii=False, default=_json_serializable)#Nach dem Umschreiben
# ujson doesn't support default argument and raises TypeError.
except TypeError:
#return self.json_lib.dumps(record)#Vor dem Umschreiben
return self.json_lib.dumps(record, ensure_ascii=False)#Nach dem Umschreiben
Fügen Sie sure_ascii = False zum Argument der dumps-Methode hinzu, die das Wörterbuch in JSON konvertiert.
Wenn ich "json_log_test.py" erneut ausführe und die Ausgabedatei überprüfe, werden die Zeichen dieses Mal nicht verstümmelt.
my-log.json
{
"extra": "Diese Zeichenkette ist ebenfalls verstümmelt",
"message": "Diese Zeichenkette ist verstümmelt",
"time": "2020-10-21T02:31:16.704940"
}
Notiz, wenn japanische Zeichen mit json.dumps () von Python verstümmelt sind - Memo für Wörter - pygo https://cortyuming.hateblo.jp/entry/20140920/p2 JSON-log-formatter · PyPI https://pypi.org/project/JSON-log-formatter/