web-dev-qa-db-fra.com

Comment puis-je enregistrer un dictionnaire dans un fichier journal?

J'ai un dictionnaire:

 d = {name : "John", age: 10}. 

Et une configuration de fichier journal comme:

logging.basicConfig(level = logging.DEBUG, filename = "sample.log")

Est-il possible de connecter ce dictionnaire dans le fichier "sample.log"? Si oui, comment faire?

13
Adit Vira

Solution simple qui fonctionne

Les fonctions de journalisation convertiront le '%s' En représentation sous forme de chaîne (et si l'objet se trouve être un conteneur, alors repr() sera utilisé pour les objets contenus)

import logging
logging.basicConfig(level=logging.DEBUG, filename='sample.log')
logging.debug('Sample dict log: %s', {'name' : "John", 'age': 10})

Comment cela apparaît dans le fichier journal:

DEBUG:root:Sample dict log: {'age': 10, 'name': 'John'}

Si vous avez des objets personnalisés (par exemple des instances de vos propres classes), vous devez implémenter un __str__ Et/ou __repr__ Judicieux pour cela, et ce qui précède fonctionnera sans aucun piratage.

Plus à ce sujet ici Différence entre __str__ et __repr__ en Python

JSON n'est pas très bon pour ça

Pour les objets qui ne sont pas de type JSON (instances d'objet, datetime, etc.), json.dumps() nécessiterait un sérialiseur personnalisé, par exemple avec datetime objets vous obtenez:

TypeError: datetime.datetime(...) is not JSON serializable

Cela vaut pour tout type qui n'est pas pris en charge par json.dumps()

Alors que le module logging trouverait une bonne représentation de l'objet

22
bakkal

Simple, vous pouvez utiliser

dict_data = {"test":"data"}
logger.info("Loging dict ---> {0}".format(dict_data))
4
Gaurav

vous pouvez le convertir en chaîne:

string_dictionary = str(d)

puis enregistrez la variable de dictionnaire de chaînes dans le fichier

en utilisant JSON

import json

d = {"name":"John","age":10}
json_string = json.dumps(d)

et si vous souhaitez reconvertir la chaîne:

d = json.loads(json_string)
2
Amr Magdy

Je suis arrivé à cette question lorsque je voulais enregistrer les lignes JSON pour Cloudwatch.

J'ai fini par utiliser python-json-logger .

Installez-le: pip install python-json-logger

Utilisation pythonjsonlogger.jsonlogger.JsonFormatter comme classe de formateur.

0
Martin Thoma