2

我将 Flask 和 Connexion 用于基于 Python 的 REST API,它在 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是 print 函数,但是,如上所示,似乎也出现了错误(尽管没有时间戳)。

4

1 回答 1

2

请在此处查看文档。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.

需要注意的一点是,来自 Web 请求的错误与 Web 请求之外的错误(例如作业、cli 等)的记录方式不同。默认行为是记录到标准错误,在您的情况下是syslog

于 2020-01-14T11:26:49.190 回答