[PYTHON] Ändern Sie die Protokolleinstellung von Flask (dictConfig), um andere Protokolle als den Root-Logger auszugeben

Einführung

Wenn Sie versuchen, die Protokollierung in Python zu implementieren, denken Sie, dass Sie sie im Grunde genommen anhand des offiziellen Tutorials erstellen.

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

logging_test.py


import logging

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

Wie in diesem Artikel ausgeführt, ist die im oberen Teil beschriebene Methode jedoch keine sehr geeignete Methode, und die folgende Notation wird empfohlen. Ich bin.

logger_test.py


from logging import getLogger
logger = getLogger(__name__)

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

Daher sollte die Protokollierung grundsätzlich mit dieser Methode implementiert werden, und die Protokollausgabe des tatsächlich verteilten Pakets ist hauptsächlich diejenige, in der der Loggername definiert ist.

Logging in Flask

Andererseits denke ich, dass es bei der Protokollierung mit Flask viele Leute gibt, die dies implementieren, indem sie auf die folgenden Websites verweisen.

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

Wenn Sie es zu diesem Zeitpunkt unter Bezugnahme auf dictConfig implementieren,

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)

Das Logger-Protokoll wird nicht ausgegeben.

[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 -

Dies liegt daran, dass das Definieren des Loggernamens mit getLogger ihn nicht länger zu einem Root-Logger macht. Um als Flask-Protokoll auszugeben, fügen Sie daher den Logger, den Sie ausgeben möchten, in die Logger von dictConfig ein. Muss hinzugefügt werden.

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

Auf diese Weise können Sie den Logger unter src ausgeben.

[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 -

Sie können auch einzelne Handler angeben, um das Protokoll auszugeben. In diesem Fall wird das Protokoll zweimal ausgegeben. Setzen Sie daher propagate auf False. Und Sie können es verhindern.

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

Geben Sie das Protokoll des importierten Pakets aus

Wenn Sie dies anwenden, können Sie auch den Logger des importierten Pakets ausgeben. Wenn Sie beispielsweise den Logger von Flask-OAuthlib ausgeben möchten, fügen Sie den Loggern die folgenden Einstellungen hinzu.

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

Auf diese Weise können Sie die Protokollausgabe des Pakets wie zuvor überprüfen.

Schließlich

Ich habe ein wenig Zeit damit verbracht, das zu untersuchen, also werde ich es als Memorandum belassen.

Recommended Posts

Ändern Sie die Protokolleinstellung von Flask (dictConfig), um andere Protokolle als den Root-Logger auszugeben
Einstellung zur Ausgabe des Protokolls zur Ausführung von cron
Ändern Sie das Standardausgabeziel in eine Datei in Python
Ändern des Aufbewahrungszeitraums für CloudWatch-Protokolle in Lambda
Ich habe versucht, das Zugriffsprotokoll mit Node.js auf dem Server auszugeben