Je n'ai pas encore trouvé un moyen de configurer la journalisation Python avec Django qui me satisfait. Mes exigences sont assez simples:
- Différents gestionnaires de journaux pour différents événements - c'est-à-dire que je veux pouvoir me connecter à différents fichiers
- Accès facile aux enregistreurs dans mes modules. Le module devrait pouvoir trouver son enregistreur avec peu d'effort.
- Devrait être facilement applicable aux modules de ligne de commande. Certaines parties du système sont des processus de ligne de commande ou de démon autonomes. La journalisation doit être facilement utilisable avec ces modules.
Ma configuration actuelle consiste à utiliser un logging.conf
fichier et une journalisation de configuration dans chaque module à partir duquel je me connecte. Ça ne va pas.
Avez-vous une configuration de journalisation que vous aimez? Veuillez le détailler: comment configurez-vous la configuration (utilisez-vous logging.conf
ou configurez-la dans le code), où / quand lancez-vous les enregistreurs, et comment y avez-vous accès dans vos modules, etc.
Réponses:
Le meilleur moyen que j'ai trouvé jusqu'à présent est d'initialiser la configuration de la journalisation dans settings.py - nulle part ailleurs. Vous pouvez utiliser un fichier de configuration ou le faire par programmation étape par étape - cela dépend uniquement de vos besoins. L'essentiel est que j'ajoute généralement les gestionnaires que je veux à l'enregistreur racine, en utilisant des niveaux et parfois en journalisant.Filtres pour obtenir les événements que je veux dans les fichiers appropriés, la console, les syslogs, etc. aussi, mais ce n'est généralement pas nécessaire dans mon expérience.
Dans chaque module, je définis un enregistreur en utilisant
et utilisez-le pour enregistrer les événements dans le module (et, si je veux différencier davantage), utilisez un enregistreur qui est un enfant de l'enregistreur créé ci-dessus.
Si mon application va être potentiellement utilisée dans un site qui ne configure pas la journalisation dans settings.py, je définis un NullHandler quelque part comme suit:
et assurez-vous qu'une instance de celui-ci est ajoutée à tous les enregistreurs créés dans les modules de mes applications qui utilisent la journalisation. (Remarque: NullHandler est déjà dans le package de journalisation pour Python 3.1, et sera dans Python 2.7.) Donc:
Ceci est fait pour garantir que vos modules jouent bien dans un site qui ne configure pas la journalisation dans settings.py, et que vous n'obtenez aucun message ennuyeux "Aucun gestionnaire n'a pu être trouvé pour le logger XYZ" (qui sont des avertissements sur des journalisation mal configurée).
Cela répond à vos exigences déclarées:
getLogger(__name__)
.settings.py
.Mise à jour: Notez qu'à partir de la version 1.3, Django intègre désormais la prise en charge de la journalisation .
la source
foo
gérer les événements enregistrésfoo.bar
. Ré. ce thread - fileConfig et dictConfig ont maintenant des options pour empêcher la désactivation des anciens enregistreurs. Voir ce numéro: bugs.python.org/issue3136 , qui est arrivé quelques mois après votre problème bugs.python.org/issue2697 - de toute façon, il a été réglé depuis juin 2008.logger = someutils.getLogger(__name__)
oùsomeutils.getLogger
retourne le loggerlogging.getLogger
avec un null_handler déjà ajouté?NullHandler
ajout - généralement juste l'enregistreur de niveau supérieur pour votre hiérarchie de paquets. Ce serait donc exagéré, OMI.Je sais que c'est déjà une réponse résolue, mais selon django> = 1.3, il y a un nouveau paramètre de journalisation.
Passer de l'ancien au nouveau n'est pas automatique, alors j'ai pensé l'écrire ici.
Et bien sûr, consultez la documentation django pour en savoir plus.
Ceci est la configuration de base, créée par défaut avec django-admin createproject v1.3 - le kilométrage peut changer avec les dernières versions de django:
Cette structure est basée sur la journalisation Python standard dictConfig , qui dicte les blocs suivants:
formatters
- la valeur correspondante sera un dict dans lequel chaque clé est un identifiant de formateur et chaque valeur est un dict décrivant comment configurer l'instance de formateur correspondante.filters
- la valeur correspondante sera un dict dans lequel chaque clé est un identifiant de filtre et chaque valeur est un dict décrivant comment configurer l'instance de filtre correspondante.handlers
- la valeur correspondante sera un dict dans lequel chaque clé est un identifiant de gestionnaire et chaque valeur est un dict décrivant comment configurer l'instance de gestionnaire correspondante. Chaque gestionnaire possède les clés suivantes:class
(obligatoire). Il s'agit du nom qualifié complet de la classe de gestionnaire.level
(optionnel). Le niveau du gestionnaire.formatter
(optionnel). L'identifiant du formateur pour ce gestionnaire.filters
(optionnel). Une liste des identifiants des filtres pour ce gestionnaire.Je fais généralement au moins ceci:
Ce qui se traduit par:
Éditer
Les exceptions de demande sont désormais toujours enregistrées et le ticket n ° 16288 :
J'ai mis à jour l'exemple de configuration ci-dessus pour inclure explicitement le filtre correct pour mail_admins afin que, par défaut, les e-mails ne soient pas envoyés lorsque le débogage a la valeur True.
Vous devez ajouter un filtre:
et appliquez-le au gestionnaire mail_admins:
Sinon,
django.core.handers.base.handle_uncaught_exception
ne transmet pas les erreurs à l'enregistreur 'django.request' si settings.DEBUG est True.Si vous ne le faites pas dans Django 1.5, vous obtiendrez un
mais les choses fonctionneront toujours correctement LES DEUX dans django 1.4 et django 1.5.
** fin de modification **
Cette conf est fortement inspirée de l'exemple de conf dans la doc django, mais en ajoutant la partie du fichier journal.
Je fais souvent aussi ce qui suit:
Ensuite, dans mon code python, j'ajoute toujours un NullHandler au cas où aucune configuration de journalisation n'est définie. Cela évite les avertissements pour aucun gestionnaire spécifié. Particulièrement utile pour les bibliothèques qui ne sont pas nécessairement appelées uniquement dans Django ( ref )
[...]
J'espère que cela t'aides!
la source
Nous initialisons la journalisation au niveau supérieur
urls.py
à l'aide d'unlogging.ini
fichier.L'emplacement du
logging.ini
est fourni danssettings.py
, mais c'est tout.Chaque module fait alors
Pour distinguer les instances de test, de développement et de production, nous avons différents fichiers logging.ini. Pour la plupart, nous avons un "journal de console" qui va à stderr avec des erreurs uniquement. Nous avons un "journal d'application" qui utilise un fichier journal de roulement régulier qui va dans un répertoire de journaux.
la source
J'utilise actuellement un système de journalisation, que j'ai créé moi-même. Il utilise le format CSV pour la journalisation.
django-csvlog
Ce projet n'a toujours pas de documentation complète, mais je travaille dessus.
la source