UTF-8 Python journalisation, comment?
J'essaie de connecter une codé en UTF-8 chaîne de caractères dans un fichier à l'aide de Python de journalisation de l'emballage. Comme un jouet par exemple:
import logging
def logging_test():
handler = logging.FileHandler("/home/ted/logfile.txt", "w",
encoding = "UTF-8")
formatter = logging.Formatter("%(message)s")
handler.setFormatter(formatter)
root_logger = logging.getLogger()
root_logger.addHandler(handler)
root_logger.setLevel(logging.INFO)
# This is an o with a hat on it.
byte_string = '\xc3\xb4'
unicode_string = unicode("\xc3\xb4", "utf-8")
print "printed unicode object: %s" % unicode_string
# Explode
root_logger.info(unicode_string)
if __name__ == "__main__":
logging_test()
Cela explose avec UnicodeDecodeError sur le logging.info() l'appel.
À un niveau inférieur, Python de journalisation de package en utilisant le package de codecs pour ouvrir le fichier journal, en passant dans le "UTF-8" argument de l'encodage. C'est bien beau, mais c'est à essayer d'écrire des chaînes d'octets dans le fichier au lieu de l'unicode des objets, qui explose. Essentiellement, le Python est cela:
file_handler.write(unicode_string.encode("UTF-8"))
Quand il convient de le faire:
file_handler.write(unicode_string)
Est-ce un bug en Python, ou suis-je en prenant fou pilules? FWIW, c'est un stock de Python 2.6 installation.
- Votre code fonctionne parfaitement bien ici. J'ai essayé de le faire échouer, mais je n'ai pas réussi.
- Et vous avez raison, le python est l'encodage en UTF-8, car il demande de la outfile ce que le codage à utiliser, et que vous avez spécifié UTF-8, donc c'est tout et bien.
- J'ai dû prendre la wayback machine de trouver le exemple vous l'avez mentionné. Intéressant.
Vous devez vous connecter pour publier un commentaire.
Vérifiez que vous disposez de la dernière version 2.6 de Python - certains Unicode bugs ont été trouvés et corrigés depuis la 2.6 est sorti. Par exemple, sur mon Ubuntu Jaunty système, j'ai couru votre script copié et collé, enlever le " /home/ted/' préfixe du nom de fichier journal. Résultat (copié et collé à partir d'une fenêtre de terminal):
Sur une zone de Windows:
Et le contenu du fichier:
Cela pourrait également expliquer pourquoi Lennart Regebro ne pouvais pas reproduire ce soit.
Avoir un code comme:
Causé:
Cela se produit parce que la chaîne de format est une chaîne d'octets, alors que certains de la chaîne de format arguments sont des chaînes unicode avec des caractères non-ASCII:
Faisant la chaîne de format unicode résout le problème:
Donc, dans votre configuration de journalisation faire tous les format de chaîne de caractères unicode:
Et le patch par défaut
logging
formateur à l'utilisation de l'unicode dans la chaîne de formatimport locale; if locale.getpreferredencoding().upper() != 'UTF-8': locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
J'ai eu un problème similaire l'exécution de Django dans Python3: Mon enregistreur est mort lors de la rencontre de certains des Trémas (äöüß), mais sinon très bien. J'ai regardé à travers un grand nombre de résultats et n'en trouve pas de travail. J'ai essayé
que j'ai obtenu à partir du commentaire ci-dessus.
Il n'a pas de travail. En regardant les paramètres régionaux en cours m'a donné quelques fous ANSI chose, qui est de dire simplement "ASCII". Qui m'a envoyé dans la mauvaise direction.
Changer le format d'enregistrement-chaînes de caractères Unicode ne serait pas aider.
Réglage de la magie de codage de commentaire au début du script ne serait pas aider.
Réglage du jeu de caractères sur le message de l'expéditeur (le texte est de un HTTP-reqeust) n'a pas aidé.
Ce N'travail a été de déterminer l'encodage sur le fichier-gestionnaire de l'UTF-8 dans
settings.py
. Parce que je n'avais rien de défini, la valeur par défaut qui allait devenirNone
. Qui, apparemment, se ASCII (ou comme j'aime à croire au sujet de: CUL-CLÉ)supervisord] environment=LC_ALL='en_US.UTF-8',LANG='en_US.UTF-8'
que j'ai trouvé ce de autre thread, mais il ne semble pas fonctionner pour moi.LC
etLANG
affecter le système sur un niveau de fonctionnement qui peut ou ne peut pas se propager vers le bas à un fichier en particulier, alors queencoding
affecte directement que sur un seul bit-stream.Essayez ceci:
Pour ce que ça vaut, je m'attendais à avoir à utiliser des codecs.ouvrir pour ouvrir les fichiers avec l'encodage utf-8, mais soit c'est la valeur par défaut ou quelque chose d'autre se passe ici, car elle fonctionne comme est comme ça.
Si j'ai bien compris votre problème correctement, le même problème devait survenir sur votre système lorsque vous ne venez:
Je suppose que le codage automatique de l'encodage des paramètres régionaux sur Unix ne fonctionnera pas jusqu'à ce que vous avez activé les paramètres régionaux conscient
if
branche dans lasetencoding
fonction de votresite
module vialocale
. Ce fichier se trouve généralement dans/usr/lib/python2.x
, ça vaut de l'inspection de toute façon. Autant que je sache, les paramètres régionaux-conscientsetencoding
est désactivé par défaut (c'est vrai pour mon Python 2.6 installation).Les choix sont:
site.py
est nécessaire)Voir aussi L'Illusoire setdefaultencoding par Ian Bicking et liens associés.
Je suis un peu en retard, mais je viens de tomber sur ce post qui m'a permis de configurer la journalisation en utf-8 très facilement
Ici le lien vers le post
ou voici le code: