[PYTHON] [Django] Un simple résumé de la fonction de sortie du journal afin que même les débutants puissent la comprendre.

introduction

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.

Fichier de configuration pour l'environnement de production

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,
        },
    },
}

Exemple d'utilisation

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

Regardons les principaux éléments de réglage

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:

Recommended Posts

[Django] Un simple résumé de la fonction de sortie du journal afin que même les débutants puissent la comprendre.
J'ai brièvement résumé les bits quantiques (débutants)
Résumé de base du scraping avec des requêtes que les débutants peuvent absolument comprendre [Python]
Tensorflow, il semble que même la valeur propre de la matrice puisse être automatiquement différenciée
#Une fonction qui renvoie le code de caractère d'une chaîne de caractères
J'ai créé une fonction pour découper l'image de python openCV, alors veuillez l'utiliser.
Un bref résumé de Linux
・ <Slack> Ecrire une fonction pour notifier Slack afin qu'elle puisse être citée à tout moment (Python)
J'ai essayé de résumer brièvement la procédure de démarrage du développement de Django
Une fonction qui mesure le temps de traitement d'une méthode en python
[python] Une note que j'ai commencé à comprendre le comportement de matplotlib.pyplot
Comprendre le nombre de paramètres d'entrée / sortie du réseau neuronal convolutif
Un bref résumé de la collection Python
Déploiement Heroku de la première application Django à laquelle les débutants sont accros
[Pour les débutants] Super introduction aux réseaux de neurones que même les chats peuvent comprendre
Je n'ai pas compris le comportement d'argsort de numpy, donc je vais le résumer
Comment créer un wrapper qui préserve la signature de la fonction à envelopper
[Python] Note: Fonction auto-conçue pour trouver la zone de distribution normale
Comprendre la commodité de Django Rest Framework
Un bref résumé de la vue d'ensemble de Pinax #djangoja
[Python] 3 types de bibliothèques qui améliorent un peu la sortie des journaux [logzero, loguru, pyrogrus]
Pour générer une valeur au milieu d'une cellule avec Jupyter Notebook
Comment compter le nombre d'éléments dans Django et sortir dans le modèle
Notez la solution car django n'a pas pu s'installer avec pip
L'histoire de la création d'une application Web qui enregistre des lectures approfondies avec Django
L'histoire de Django créant une bibliothèque qui pourrait être un peu plus utile
Lisez l'image postée par flask afin qu'elle puisse être manipulée par opencv
Je n'ai pas compris le redimensionnement de TensorFlow, alors je l'ai résumé visuellement.
L'expérience de Hackason selon laquelle il est le plus important de comprendre les sentiments de l'organisateur
Le cryptage SHA-512 du mot de passe a été scripté pour pouvoir être automatisé sans trop se soucier de l'environnement d'exécution.