La journalisation des données de la variable avec la nouvelle chaîne de format
Je utiliser la fonction de journalisation pour python 2.7.3. La Documentation pour cette version de Python dire:
l'enregistrement package pré-dates plus récentes options de formatage telles que les str.format() et string.De modèle. Ces nouvelles options de mise en forme sont pris en charge...
J'aime "nouveau" format avec des accolades. Donc, je suis en train de faire quelque chose comme:
log = logging.getLogger("some.logger")
log.debug("format this message {0}", 1)
Et obtenez l'erreur:
TypeError: pas tous les arguments converti lors de la mise en forme de chaîne
Ce qui me manque ici?
P. S. je ne veux pas utiliser
log.debug("format this message {0}".format(1))
parce que dans ce cas, le message est toujours en cours de formatage, indépendamment de l'enregistreur de niveau.
- Vous pouvez faire ceci:
log.debug("format this message%d" % 1)
- vous devez configurer le
Formatter
l'utilisation de '{' comme style - Merci pour les conseils mais non. Veuillez vous reporter à "p.s." l'article pourquoi. BTW journal.debug("format de ce message de%d", 1) - fonctionne très bien.
- Comment le configurer? Est-il direct à la documentation de faire cela?
- Je l'ai trouvé. S'il vous plaît faire une réponse afin que je puisse le définir comme "droit de réponse. Je vous remercie une fois de plus.
- soit définir par programmation sur l'enregistreur, ou utiliser un fichier de configuration. Regardez les exemples dans le lien.
- Combien de temps jusqu'à ce qu'il y a une solution dans la stdlib veuillez Q_Q
Vous devez vous connecter pour publier un commentaire.
EDIT: prendre un coup d'oeil à la
StyleAdapter
approche @Dunes de réponse à la différence de cette réponse; il permet d'utiliser d'autres styles de mise en forme sans le passe-partout tout en appelant enregistreur de méthodes (debug(), info(), error(), etc).De la documentation — Utilisation d'autres styles de mise en forme:
Et:
Copier-coller de ce
wherever
module:Alors:
Remarque: le formatage est retardée jusqu'à ce qu'il est nécessaire, par exemple, si les messages de DÉBOGAGE ne sont pas connectés, puis la mise en forme n'est pas réalisée à tous.
num = 2; name = 'placeholders'; log.debug(f'Message with {num} {name}')
Ici est une autre option qui n'est pas le mot-clé des problèmes mentionnés dans les Dunes de réponse. Il ne peut gérer que de position (
{0}
) des arguments et pas de mot-clé ({foo}
) arguments. Elle ne nécessite pas de deux appels à la fonction format (en utilisant le trait de soulignement). Il ne le ick-facteur de sous-classementstr
:Vous l'utiliser comme ceci:
Bien sûr, vous pouvez supprimer la vérification a noté avec
# optional
pour forcer tous les messages par le biais de l'adaptateur à utiliser le nouveau style de mise en forme.Remarque pour tous ceux qui lisent cette réponse ans plus tard: Départ avec Python 3.2, vous pouvez utilisez le paramètre de style avec
Formatter
objets:Les docs donnent l'exemple
logging.Formatter('{asctime} {name} {levelname:8s} {message}', style='{')
Noter que dans ce cas, vous ne pouvez toujours pas d'appel de la
logger
avec le nouveau format. I. e., le suivant ne fonctionne toujours pas:Formatter
, ce qui est correct (je pense). LeStyleAdapter
fonctionne toujours,BraceString
est une chaîne de sous-classe, il est sûr de retourner lui-même à partir de__str__
C'était ma solution pour le problème quand j'ai trouvé l'enregistrement seulement utilise printf mise en forme de style. Il permet la journalisation des appels à restent les mêmes: il n'est pas de la syntaxe comme
log.info(__("val is {}", "x"))
. Le changement de code est d'envelopper l'enregistreur dans unStyleAdapter
.D'Usage:
Il est intéressant de noter que cette mise en oeuvre a des problèmes si les mots clés utilisés pour attelle de substitution inclure
level
,msg
,args
,exc_info
,extra
oustack_info
. Ce sont les noms d'argument utilisé par lelog
méthode deLogger
. Si vous avez besoin de l'un de ces noms, puis modifierprocess
pour exclure ces noms ou tout simplement supprimerlog_kwargs
de la_log
appel. Sur une autre note, cette mise en œuvre est également ignore silencieusement mal orthographié les mots-clés destiné à l'Enregistreur (par exemple.ectra
).La solution facile serait d'utiliser la excellent
journal
moduleOu la plus complète:
Comme d'autres réponses mentionner, le corset-style de mise en forme introduit en Python 3.2 est utilisée uniquement sur la chaîne de format, pas le journal des messages.
Pour permettre corset-style de mise en forme sur le réel message de log, nous pouvons singe-patch un peu de l'enregistreur de données de code.
Les correctifs suivants la
logging
module pour créer unget_logger
fonction qui retourne un enregistreur de frappe qui utilise le nouveau style de mise en forme pour chaque enregistrement de journal qu'elle gère.Utilisation:
Notes:
logging.getLogger
avecget_logger
)get_logger
fonction (ne pas briser la 3ème partie de paquets).logging.getLogger()
appel, le nouveau style de mise en forme s'applique toujours.exc_info
,stack_info
,stacklevel
etextra
).logging.LogRecord
objets comme d'habitude (utile dans certains cas avec un journal personnalisé gestionnaires).journalisation
module de code source il me semble qu'il doit travailler tout le chemin du retour à la version 2.6 de Python quandstr.format
a été mis en place (mais je ne l'ai testé en 3.5 et plus)Essayer
logging.setLogRecordFactory
en Python 3.2+:%
de mise en forme que le dossier de l'usine est globale pour le module de journalisation.Voici quelque chose de très simple qui fonctionne:
Alors:
J'ai créé un module de Formatage personnalisé, appelé ColorFormatter qui traite le problème comme ceci:
De sorte qu'il soit compatible avec les différentes bibliothèques.
L'inconvénient est qu'il n'est probablement pas performant en raison de potentiellement tenter format de la chaîne deux fois.