Колбы дубликатов журналов после импорта fbprophet - PullRequest
1 голос
/ 05 июня 2019

Я бы хотел использовать регистрацию в моем приложении Flask, просто вызывая logging.getLogger('myapi') в каждом из файлов, в который мне нужно войти.

Должно быть одно место для определения обработчика и формата дляэто «глобальный» регистратор приложений.Это работает, но Flask также постоянно регистрирует свои собственные журналы в формате по умолчанию.Эти журналы существуют только при импорте библиотеки fbprophet.Я хотел бы запретить Flask регистрировать эти дополнительные неформатированные дубликаты журналов.

(Flask также имеет регистратор werkzeug, что нормально и может остаться.)

Код :

import sys
import logging
import fbprophet
from flask import Flask, jsonify
from werkzeug.serving import run_simple

# Set up my custom global logger
log = logging.getLogger('myapi')
handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(logging.Formatter('*** %(asctime)s %(levelname)s %(message)s'))
log.addHandler(handler)
log.setLevel(logging.DEBUG)

def create_app(config={}):
    ''' Application factory to create and configure the app '''
    app = Flask('myapi', instance_relative_config=False)
    app.config.from_mapping(config)

    log.info('TEST INFO')
    log.debug('TEST DEBUG')

    @app.route('/health')
    def health():
        log.info('Health OK')
        return 'OK'

    return app

if __name__ == '__main__':
    dev_config = {'SECRET_KEY': 'dev', 'DEBUG': False}
    app = create_app(dev_config)
    run_simple('localhost', 5000, app)

Вывод:

Я ожидаю увидеть журналы с префиксом ***.Те, которые начинаются с LEVEL, появляются только когда я импортирую пророка в Facebook.

* Serving Flask app "main.py" (lazy loading)
* Environment: development
* Debug mode: on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
*** 2019-06-05 14:17:56,702 INFO TEST INFO          # good log
INFO:myapi:TEST INFO                                # bad dupe log
*** 2019-06-05 14:17:56,702 DEBUG TEST DEBUG
DEBUG:myapi:TEST DEBUG
*** 2019-06-05 14:17:56,703 INFO TEST INFO
INFO:myapi:TEST INFO
*** 2019-06-05 14:17:56,703 DEBUG TEST DEBUG
DEBUG:myapi:TEST DEBUG
*** 2019-06-05 14:18:10,405 INFO Health OK
INFO:myapi:Health OK
127.0.0.1 - - [05/Jun/2019 14:18:10] "GET /health HTTP/1.1" 200 -               # good werkzeug api log
INFO:werkzeug:127.0.0.1 - - [05/Jun/2019 14:18:10] "GET /health HTTP/1.1" 200 - # bad dupe log

Дополнительные пояснения:

Я тоже пытался настроить регистратор приложения, ноЯ не хочу вызывать current_app.logger из других модулей.

Я попытался отключить регистратор Flask с помощью logging.getLogger('flask.app').handlers.clear(), но это также не работает.

При импорте fbprophetЯ получаю следующие ошибки консоли (от пророка):

ERROR:fbprophet:Importing matplotlib failed. Plotting will not work.
ERROR:fbprophet:Importing matplotlib failed. Plotting will not work.
*** 2019-06-05 14:29:06,488 INFO TEST INFO
INFO:myapi:TEST INFO

Я думал, что это может быть причиной проблемы, поэтому я исправил ошибки после этого .Но Flask все еще регистрирует дополнительные журналы.

import plotly
import matplotlib as mpl
mpl.use('TkAgg')
import fbprophet

Сводка:

Поиск отформатированных глобальных журналов во Flask без дубликатов журналов.Мне просто нужны мои глобальные logging.getLogger('myapi') и werkzeug журналы API.

1 Ответ

0 голосов
/ 05 июня 2019

Вы можете осуществлять поиск по всем зарегистрированным регистраторам и изменять их настройки по мере необходимости.Похоже, fbprophet, вероятно, устанавливает свой собственный экземпляр logger, поэтому, надеюсь, он будет установлен на нужный вам уровень, если вы сделаете что-то вроде этого:

for logger_name in logging.root.manager.loggerDict:
    print(f"found a logger:{logger_name}")
    logger = logging.getLogger(logger_name)
    logger.setLevel(logging.ERROR)

    if logger_name == 'myapi':
        logger.setLevel(logging.INFO)
...