[PYTHON] Comment gérer le problème de déformation des caractères japonais lors de la sortie de journaux à l'aide du formateur de journaux JSON

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é.

environnement

Windows10 Famille 10.0.18362 Build 18362 Python 3.8.3 JSON-log-formatter 0.3.0

Exemple d'échec

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.

Solution

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"
}

Site de référence

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/

Recommended Posts

Comment gérer le problème de déformation des caractères japonais lors de la sortie de journaux à l'aide du formateur de journaux JSON
[GNOME] Comment éviter le problème que les caractères candidats à la conversion ne disparaissent pas lors de la conversion en japonais
Comment gérer le problème du déplacement du répertoire actuel lorsque Python est exécuté depuis Atom
Comment gérer les caractères déformés dans json de Django REST Framework
Comment résoudre le problème de l'échec de la construction lorsque CI / CD de Python Function avec AWS Amplify
[systemd] Comment faire face au problème que fancontrol ne fonctionne pas après la suspension
Une histoire sur la façon de traiter le problème CORS
Comment gérer l'entrée du terminal dans l'environnement pipenv sans autorisation lors de l'utilisation de pipenv avec vscode
[VLC] Comment gérer le problème de ne pas être au premier plan pendant la lecture
Comment traiter l'erreur "Impossible de charger le module" canberra-gtk-module "qui apparaît lorsque vous exécutez OpenCV
[Note] Les caractères japonais sont déformés avec atom-runner
Comment gérer l'erreur OAuth2 lors de l'utilisation des API Google à partir de Python
[AWS] Comment gérer Wordpress "La réponse n'est pas la bonne réponse JSON"
Comment gérer les erreurs en frappant pip ②
[Python] Comment gérer les caractères japonais avec openCV
Comment traiter les problèmes qui surviennent dans les prévisions futures à l'aide du modèle SARIMA (modèle de moyenne mobile de la somme de retour automatique saisonnier)
Comment traiter l'erreur "Erreur de type: Aucune signature correspondante trouvée" lors de l'utilisation de pandas fillna
Comment désactiver la fonction de référence lors de la sortie de PyYaml
L'histoire de l'affichage des personnages dans l'entrée japonaise de Kivy
Comment gérer le phénomène que Python (notebook Jupyter) exécuté sur WSL devient abandonné
Comment gérer l'erreur selon laquelle le conteneur MySQL de Docker ne démarre pas sur Docker Toolbox
Je souhaite générer une sortie lors de la conversion de la valeur du type (par exemple, datetime) qui n'est pas pris en charge lors de la sortie de json avec python
Comment ne pas charger d'images lors de l'utilisation de PhantomJS avec Selenium
Comment résoudre la protection CSRF lors de l'utilisation d'AngularJS avec Django
Résolvez le problème japonais lors de l'utilisation du module CSV en Python.
Comment gérer UnicodeDecodeError lors de l'exécution du téléchargement d'image Google
Une histoire qui n'a pas fonctionné lorsque j'ai essayé de me connecter avec le module de requêtes Python
Python Django Comment gérer les cas où le courrier du transporteur japonais est lu par Email Validator
Le Katakana demi-largeur n'est pas brouillé lors de l'utilisation de python + sélénium execute_script
Comment gérer les erreurs lors de l'installation de whitenoise et du déploiement sur Heroku
Comment gérer les erreurs lors de l'installation de Python et de pip avec choco
[Développement Web avec Python] Mesures contre les caractères déformés lors de la sortie html
Mémorandum Expression régulière Lorsqu'il y a plusieurs caractères que vous souhaitez séparer dans la chaîne de caractères
Je souhaite résoudre le problème de fuite de mémoire lors de la sortie d'un grand nombre d'images avec Matplotlib