使用 Connexion 在 Python Flask 应用程序中使用哪个记录器
Which logger to use in a Python Flask app with Connexion
我将 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
之外是打印函数,但是,如上所示,错误似乎也被拾取(尽管没有时间戳)。
请在此处查看文档。 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 等)的记录方式不同。默认行为是记录到标准错误,在您的情况下是 syslog
我将 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
之外是打印函数,但是,如上所示,错误似乎也被拾取(尽管没有时间戳)。
请在此处查看文档。 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 等)的记录方式不同。默认行为是记录到标准错误,在您的情况下是 syslog