Какой регистратор использовать в приложении Python Flask с Connexion - PullRequest
0 голосов
/ 14 января 2020

Я использую Flask и Connexion для REST API на основе Python, и он работает в контейнере Docker. Вот main.py:

import connexion
import logging
from app.log import handler

# initiate swagger/connexion
application = connexion.App(__name__, specification_dir='./')
application.add_api('swagger.yml')

# logging
application.app.logger.handlers.clear()
application.app.logger.addHandler(handler)
application.app.logger.setLevel(logging.DEBUG)
application.app.logger.debug('application starting...')

# if we're running in standalone mode, run the application
if __name__ == '__main__':
    application.run(host='0.0.0.0', port=5000, debug=True)

Это прекрасно работает, и на моем сервере системного журнала я вижу:

2020-01-14 11:03:14,951 app main:DEBUG application starting...

Однако я не уверен, как правильно войти в систему из файлов за пределами main.py. Например, у меня есть status.py, который имеет один маршрут для GET /status, а код выглядит следующим образом:

import yaml
from flask import current_app
import logging

def read():

    # LOG TESTING
    current_app.logger.debug('Test using current_app')
    logging.getLogger(__name__).debug('Test using getLogger')
    print('Test using print')

    with open('./swagger.yml', 'r') as f:
        y = yaml.load(f)

    return {
        # .... some data here
    }

На моем сервере системного журнала я вижу:

Test using print
./status.py:22: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.
  y = yaml.load(f)

Я хотел бы использовать тот же механизм ведения журнала, который main.py использует во всех моих отдельных файлах, но я могу заставить его работать только с main.py, и единственное, что работает за пределами main.py, - это печать однако, как видно из вышесказанного, ошибки также могут быть обнаружены (хотя и без отметки времени).

1 Ответ

1 голос
/ 14 января 2020

Пожалуйста, просмотрите документы здесь. https://flask.palletsprojects.com/en/1.1.x/logging/ Вы изменяете запись в журнале после вызова app.log или app.logger (я забыл), поэтому приложение уже запущено. Вам нужно переопределить значение по умолчанию. Документ охватывает это, но вот суть.

Прежде чем создавать экземпляр приложения Flask. сделать это

from logging.config import dictConfig

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__) # important!  logging stuff is set before this.

Следует отметить, что ошибки веб-запроса регистрируются не так, как ошибки вне веб-запросов (например, задания, cli et c). Поведение по умолчанию заключается в регистрации стандартной ошибки, которая в вашем случае syslog

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...