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?
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
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
Simple, vous pouvez utiliser
dict_data = {"test":"data"}
logger.info("Loging dict ---> {0}".format(dict_data))
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)
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.