[PYTHON] Umgang mit dem Problem, dass japanische Zeichen bei der Ausgabe von Protokollen mit dem JSON-Protokollformatierer verstümmelt sind

Ich habe den JSON-Protokollformatierer verwendet, weil ich das Protokoll in JSON abrufen möchte, aber aus irgendeinem Grund ist Japanisch (Doppelbytezeichen) verstümmelt.

Umgebung

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

Fehlerbeispiel

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.

Lösung

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

Referenzseite

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/

Recommended Posts

Umgang mit dem Problem, dass japanische Zeichen bei der Ausgabe von Protokollen mit dem JSON-Protokollformatierer verstümmelt sind
[GNOME] So vermeiden Sie das Problem, dass Konvertierungskandidaten beim Konvertieren in Japanisch nicht verschwinden
So gehen Sie mit dem Problem um, dass das aktuelle Verzeichnis verschoben wird, wenn Python von Atom ausgeführt wird
Wie man mit verstümmelten Charakteren in json von Django REST Framework umgeht
Wie man mit dem Problem umgeht, dass die Erstellung fehlschlägt, wenn CI / CD von Python Function mit AWS Amplify
[systemd] Wie gehe ich mit dem Problem um, dass fancontrol nach dem Anhalten nicht funktioniert?
Eine Geschichte über den Umgang mit dem CORS-Problem
Umgang mit dem Terminal, das ohne Erlaubnis in die pipenv-Umgebung gelangt, wenn pipenv mit vscode verwendet wird
[VLC] Wie man mit dem Problem umgeht, dass es während der Wiedergabe nicht im Vordergrund steht
Umgang mit dem Fehler "Fehler beim Laden des Moduls" canberra-gtk-module ", der beim Ausführen von OpenCV auftritt
[Anmerkung] Japanische Schriftzeichen sind mit Atom-Runner verstümmelt
Umgang mit OAuth2-Fehlern bei Verwendung von Google APIs aus Python
[AWS] Umgang mit Wordpress "Die Antwort ist nicht die richtige JSON-Antwort."
Umgang mit Fehlern beim Auftreffen auf pip pip
[Python] Umgang mit japanischen Zeichen mit openCV
Umgang mit Problemen, die bei zukünftigen Vorhersagen auftreten, mithilfe des SARIMA-Modells (Modell der gleitenden Durchschnittssumme der saisonalen Selbstrückgabe)
Umgang mit dem Fehler "Typfehler: Keine übereinstimmende Signatur gefunden" bei Verwendung von pandas fillna
So deaktivieren Sie die Referenzfunktion bei der Ausgabe von PyYaml
Die Geschichte der Anzeige der Zeichen in Kivys japanischer Eingabe
Wie man mit dem Phänomen umgeht, dass Python (Jupyter Notebook) auf WSL ausgeführt wird, wird abgebrochen
So gehen Sie mit dem Fehler um, dass der MySQL-Container von Docker in der Docker Toolbox nicht gestartet werden kann
Ich möchte ausgeben, während der Wert des Typs (z. B. datetime) konvertiert wird, der bei der Ausgabe von json mit Python nicht unterstützt wird
So laden Sie keine Bilder, wenn Sie PhantomJS mit Selen verwenden
So lösen Sie den CSRF-Schutz bei Verwendung von AngularJS mit Django
Lösen Sie das japanische Problem, wenn Sie das CSV-Modul in Python verwenden.
Umgang mit UnicodeDecodeError beim Ausführen des Downloads von Google-Bildern
Eine Geschichte, die nicht funktioniert hat, als ich versucht habe, mich mit dem Python-Anforderungsmodul anzumelden
Python Django Umgang mit Fällen, in denen japanische Trägerpost von Email Validator abgespielt wird
Katakana mit halber Breite wird bei Verwendung von Python + Selen nicht ausgeführt. Execute_script
Umgang mit Fehlern bei der Installation von Whitenoise und der Bereitstellung auf Heroku
Umgang mit Fehlern bei der Installation von Python und Pip mit Choco
[Webentwicklung mit Python] Misst bei der Ausgabe von HTML gegen verstümmelte Zeichen
Memorandum Regulärer Ausdruck Wenn die Zeichenfolge mehrere Zeichen enthält, die Sie trennen möchten
Ich möchte das Problem des Speicherverlusts bei der Ausgabe einer großen Anzahl von Bildern mit Matplotlib lösen