Il y a certaines choses que vous ne comprenez pas à première vue sur la fonction de journalisation de Django. Surtout le fichier de configuration. Je vais le résumer facilement et de manière concise.
C'est un paramètre de journal, mais si vous ne le définissez pas vous-même (s'il n'y a pas de définition de LOGGING dans settings.py) [Paramètres par défaut inclus dans la source Django](https://github.com/django/django/ blob / master / django / utils / log.py) est utilisé. Cependant, le journal de sortie n'est pas très facile à voir, donc dans la plupart des cas, vous le définissez vous-même. Voici un exemple de configuration supposant un environnement de production. Ajoutez le contenu suivant à settings.py.
settings.py
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
#Paramètres de format de sortie du journal
'formatters': {
'production': {
'format': '%(asctime)s [%(levelname)s] %(process)d %(thread)d '
'%(pathname)s:%(lineno)d %(message)s'
},
},
#Paramètres du gestionnaire
'handlers': {
'file': {
'level': 'INFO',
'class': 'logging.FileHandler',
'filename': '/var/log/{}/app.log'.format(PROJECT_NAME),
'formatter': 'production',
},
},
#Paramètres de l'enregistreur
'loggers': {
#Un enregistreur qui récupère les journaux de toutes les applications que vous ajoutez
'': {
'handlers': ['file'],
'level': 'INFO',
'propagate': False,
},
#Un enregistreur qui récupère tous les journaux produits par Django lui-même
'django': {
'handlers': ['file'],
'level': 'INFO',
'propagate': False,
},
},
}
views.py
import logging
logger = logging.getLogger(__name__)
logger.info("log info test!")
logger.error("log error test!")
Le journal a 5 niveaux selon son importance. Vous pouvez générer le journal en laissant le logger exécuter la méthode avec le même nom que le niveau de journal comme dans l'exemple d'utilisation ci-dessus.
Nom | Utilisation |
---|---|
DEBUG | Enregistrement de débogage |
INFO | Enregistrement du fonctionnement normal |
WARNING | Enregistrement d'avertissement |
ERROR | Problèmes graves tels que des erreurs |
CRITICAL | Problèmes fatals tels que l'arrêt du système lui-même |
disable_existing_loggers Dans le cas de Ture, tous les enregistreurs non définis dans le fichier de configuration seront désactivés. À ce stade, vous vous demandez peut-être «Qu'est-ce qu'un enregistreur qui n'est pas défini dans le fichier de paramètres?», Mais cela signifie que tous les enregistreurs dont les noms ne sont pas définis dans l'élément ** logger ** décrit plus loin sont désactivés. Sera fait. ** Fondamentalement False est OK **, mais cela a été vérifié en détail dans cet article, veuillez donc vérifier si vous êtes intéressé.
formatters Formatage de la sortie du journal. Si vous le définissez correctement ici, le format de sortie du journal sera aligné et le journal sera plus facile à voir, vous pouvez donc penser que ** le paramètre est requis **. Que signifient% (asctime) et% (levelname) dans Official Documents en japonais Il est décrit d'une manière facile à comprendre.
handlers Il s'agit du paramètre de la méthode de sortie du journal.
loggers Il s'agit du paramètre de journalisation qui est réellement utilisé depuis l'application. L'enregistreur défini par "''" est une description qui suit l'exemple de sortie.
import logging
logger = logging.getLogger(__name__)
Il peut être obtenu à partir de chaque application. Fondamentalement, il suffit d'avoir ceci et le paramètre de journalisation que django lui-même produit.
Ce qui suit est une explication de propagate. L'enregistreur peut en fait avoir un ** espace de noms **. À titre d'exemple, définissez «logA» et «logA.logB» comme indiqué ci-dessous.
'logger': {
'logA': {
'handlers': ['file'],
'level': 'INFO',
'propagate': False,
},
'logA.logB': {
'handlers': ['file'],
'level': 'INFO',
'propagate': False,
},
Ensuite, récupérez le logger de l'application comme suit.
views.py
import logging
logger = logging.getLogger('logA.logB.logC')
logger.info("log info test!")
À ce stade, logC n'est pas défini, donc ** logB est acquis ** en conséquence. Si l'enregistreur spécifié n'existe pas, il ira jusqu'à l'espace de noms ci-dessus et obtiendra le premier trouvé.
Ici, si logB et logC sont également définis et que la propriété est True, pour tous les logA, logB, logC
logger.info("log info test!")
Est exécuté. En d'autres termes, si les paramètres de logA, logB et logC sont identiques à l'exception du nom, ** les journaux avec exactement le même contenu seront générés trois fois **. En tant que nom de propagate, la commande de sortie de journal est également propagée à l'enregistreur dans la hiérarchie supérieure. En guise d'utilisation, définissez logA pour la sortie du fichier, logB pour la sortie de la console, obtenez logA si vous n'avez besoin que du fichier, obtenez logB si vous souhaitez sortir vers la console dans l'environnement de développement, etc. Est-ce une image comme ça (je ne l'ai jamais utilisée ...).
c'est tout. À la fin, le contenu était un peu compliqué, mais à moins que vous ne fassiez quelque chose de compliqué, je pense que les paramètres de base sont OK avec juste le contenu décrit dans cet article. Merci pour votre travail acharné: cat2: