Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在带有Connexion的Python Flask应用程序中使用哪个记录器_Python_Logging_Flask_Connexion - Fatal编程技术网

在带有Connexion的Python Flask应用程序中使用哪个记录器

在带有Connexion的Python Flask应用程序中使用哪个记录器,python,logging,flask,connexion,Python,Logging,Flask,Connexion,我将Flask和Connexion用于基于Python的RESTAPI,它在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')

我将Flask和Connexion用于基于Python的RESTAPI,它在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)
这很好,在我的syslog服务器中,我可以看到:

2020-01-14 11:03:14,951 app main:DEBUG application starting...
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
之外的文件正确登录。例如,我有一个
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
    }
在我的系统日志服务器中,我可以看到:

2020-01-14 11:03:14,951 app main:DEBUG application starting...
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
之外唯一起作用的是打印功能,但是,如上所述,错误似乎也会被发现(尽管没有时间戳).

请查看此处的文档。您在调用
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

,您可以在main中启动记录器,并在单独的文件中使用,例如: