[PYTHON] Modifier le paramètre de journal de Flask (dictConfig) pour générer des journaux autres que le journal racine

introduction

Lorsque vous essayez d'implémenter la journalisation en python, je pense que vous la construisez essentiellement en vous référant au tutoriel officiel.

https://docs.python.org/ja/3/howto/logging.html

logging_test.py


import logging

def main():
    logging.info("it is logging.")

Cependant, comme indiqué dans cet article, la méthode décrite dans la partie supérieure n'est pas une méthode très appropriée et la notation suivante est recommandée. Je suis.

logger_test.py


from logging import getLogger
logger = getLogger(__name__)

def main():
    logger.info("it is logger.")

Par conséquent, en gros, la journalisation doit être implémentée par cette méthode, et la sortie du journal du package réellement distribué est principalement celle dans laquelle le nom de l'enregistreur est défini.

Connexion à Flask

En revanche, lors de la journalisation avec Flask, je pense que de nombreuses personnes l'implémentent en se référant aux sites suivants.

https://msiz07-flask-docs-ja.readthedocs.io/ja/latest/logging.html

À ce moment-là, si vous l'implémentez en référence à dictConfig,

app.py


from flask import Flask
from logging.config import dictConfig
from src.logging import logging_test, logger_test

dictConfig({
    'version': 1,
    'formatters': {'default': {
        'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
    }},
    'handlers': {'wsgi': {
        'class': 'logging.StreamHandler',
        'stream': 'ext://flask.logging.wsgi_errors_stream',
        'formatter': 'default'
    }},
    'root': {
        'level': 'INFO',
        'handlers': ['wsgi']
    }
})

app = Flask(__name__)

@app.route('/')
def hello_world():
    logging_test.main()
    logger_test.main()
    return 'Hello, World!'

if __name__ == "__main__":
    app.run(debug=True)

Le journal de l'enregistreur ne sera pas sorti.

[2020-11-12 09:47:05,506] INFO in logging_test: it is logging.
[2020-11-12 09:47:05,506] INFO in _internal: 127.0.0.1 - - [12/Nov/2020 09:47:05] "GET / HTTP/1.1" 200 -

En effet, la définition du nom du logger avec getLogger en fait plus un enregistreur racine. Par conséquent, afin de générer un journal Flask, placez le logger que vous souhaitez générer dans les loggers de dictConfig. Besoin d'être ajouté.

    'loggers': {'src': {
        'level': 'INFO'
    }},

En faisant cela, vous pourrez sortir le logger sous src.

[2020-11-12 10:02:17,987] INFO in logging_test: it is logging.
[2020-11-12 10:02:17,987] INFO in logger_test: it is logger.
[2020-11-12 10:02:17,988] INFO in _internal: 127.0.0.1 - - [12/Nov/2020 10:02:17] "GET / HTTP/1.1" 200 -

Vous pouvez également spécifier des gestionnaires individuels pour générer le journal. Dans ce cas, le journal sera généré deux fois, alors définissez propagate sur False. Et vous pouvez l'empêcher.

    'loggers': {'src': {
        'level': 'INFO',
        'handlers': ['wsgi'],
        'propagate': False
    }},

Sortie du journal du package importé

De plus, en appliquant cela, vous pouvez générer le journal du package importé. Par exemple, si vous souhaitez générer le journal de Flask-OAuthlib, ajoutez le paramètre suivant aux enregistreurs.

    'flask_oauthlib': {
        'level': 'DEBUG'
    }

En faisant cela, vous pourrez vérifier la sortie du journal du package comme auparavant.

finalement

J'ai passé un peu de temps à essayer de le savoir, je vais donc laisser cela comme un mémorandum.

Recommended Posts

Modifier le paramètre de journal de Flask (dictConfig) pour générer des journaux autres que le journal racine
Paramètre pour afficher le journal de l'exécution de cron
Changer la destination de sortie standard en un fichier en Python
Modifier la période de conservation des journaux CloudWatch Logs dans Lambda
J'ai essayé de sortir le journal d'accès au serveur en utilisant Node.js