J'ai utilisé le formateur de journal JSON parce que je veux obtenir le journal en JSON, mais pour une raison quelconque, le japonais (caractères à deux octets) est déformé.
Windows10 Famille 10.0.18362 Build 18362 Python 3.8.3 JSON-log-formatter 0.3.0
Exécutez le programme suivant.
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-Sortie à 8
json_handler.setFormatter(formatter)
logger = logging.getLogger('my_json')
logger.addHandler(json_handler)
logger.setLevel(logging.INFO)
logger.info('Cette chaîne de caractères est tronquée', extra={'extra': 'Cette chaîne de caractères est également déformée'})
Le fichier journal de sortie "my-log.json" est le suivant. (Conçu pour une visualisation facile)
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"
}
L'extra et le message sont déformés.
Réécrivez la méthode "to_json" de "\ _ \ _ init__.py" dans le répertoire "json_log_formatter" comme suit.
__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)#Avant de réécrire
return self.json_lib.dumps(record, ensure_ascii=False, default=_json_serializable)#Après réécriture
# ujson doesn't support default argument and raises TypeError.
except TypeError:
#return self.json_lib.dumps(record)#Avant de réécrire
return self.json_lib.dumps(record, ensure_ascii=False)#Après réécriture
Ajoutez ensure_ascii = False à l'argument de la méthode dumps qui convertit le dictionnaire en JSON.
Lorsque j'exécute à nouveau "json_log_test.py" et que je vérifie le fichier de sortie, les caractères ne sont pas déformés cette fois.
my-log.json
{
"extra": "Cette chaîne de caractères est également déformée",
"message": "Cette chaîne de caractères est tronquée",
"time": "2020-10-21T02:31:16.704940"
}
Mémo lorsque les caractères japonais sont déformés avec json.dumps () de Python --Mémo de 牌 linguistique -pygo https://cortyuming.hateblo.jp/entry/20140920/p2 JSON-log-formatter · PyPI https://pypi.org/project/JSON-log-formatter/