我想通过简单地调用logging.getLogger('myapi')
我需要记录的每个文件来在我的 Flask 应用程序中使用日志记录。
应该有一个地方来定义这个“全局”应用程序记录器的处理程序和格式。这可行,但 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)
输出:
我希望看到以 . 为前缀的日志***
。仅在我导入 facebook 先知时LEVEL
才会出现。
* 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
我认为这可能会导致问题,所以我修复了this 之后的错误。但 Flask 仍在记录额外的日志。
import plotly
import matplotlib as mpl
mpl.use('TkAgg')
import fbprophet
概括:
在 Flask 中寻找格式化的全局日志,没有重复的日志。我只需要我的全局logging.getLogger('myapi')
和werkzeug
API 日志。