Python日志记录:Flask + uWsgi + nginx

5
大家好,当我在Uwsgi后台运行Flask应用程序时,我无法记录INFO和DEBUG消息。不仅无法记录调试和信息消息,格式也无法正常工作。
formatter = logging.Formatter(  # pylint: disable=invalid-name
    '%(asctime)s %(levelname)s %(process)d ---- %(threadName)s  '
    '%(module)s : %(funcName)s {%(pathname)s:%(lineno)d} %
    (message)s','%Y-%m-%dT%H:%M:%SZ')

handler = StreamHandler()
handler.setLevel(logging.DEBUG)
handler.setFormatter(formatter)

application.logger.addHandler(handler)

logging.debug('Debug Message')
logging.info('Info Message')
logging.warning('Warning Message')
logging.error('Error Message')
logging.critical('Critical ')

在uwsgi日志文件中的输出是:
*** Operational MODE: preforking ***
WARNING:root:Warning Message
ERROR:root:Error Message
CRITICAL:root:Critical 
WSGI app 0 (mountpoint='') ready in 2 seconds on interpreter 0x26f39b0 pid: 9574 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: 9574)

如您所见,只有错误、警告和严重的消息被记录下来。而且格式不起作用。(在werkzeug本地运行时一切正常)。

uwsgi配置文件如下:

[uwsgi]
project = myproject
uid = nginx
group = nginx
base = /srv
req-logger = file:/var/log/uwsgi/access.log
logger = file:/var/log/uwsgi/error.log

chdir = %(base)/www
home = %(base)/env
module = application
callable = application

master = true
processes = 4

socket = /var/run/uwsgi/%(project).sock
chown-socket = %(uid):%(group)
chmod-socket = 664
vacuum = true

我查看了StackOverflow上的所有解决方案,但它们都没有起作用。

非常感谢您的帮助。


你解决了这个问题吗?我也遇到了同样的问题。 - Nadine
很遗憾,@Nadine,不行。 - Riki Lyng
1
还是没有进展?我也遇到了同样的问题。 - musca999
3个回答

1
通过访问application.logger.addHandler(handler),您初始化了Flask的记录器。然而,在此后的行中,您使用logging.debug('Debug Message')的根记录器,而不是应用程序记录器application.logger.debug('Debug Message')
此外,app.logger.setLevel(logging.DEBUG)
完整示例:
from flask import Flask
app = Flask(__name__)

formatter = logging.Formatter(  # pylint: disable=invalid-name
    '%(asctime)s %(levelname)s %(process)d ---- %(threadName)s  '
    '%(module)s : %(funcName)s {%(pathname)s:%(lineno)d} %(message)s','%Y-%m-%dT%H:%M:%SZ')

handler = StreamHandler()
handler.setFormatter(formatter)

app.logger.setLevel(logging.DEBUG)
app.logger.addHandler(handler)
app.logger.removeHandler(default_handler)

app.logger.debug('Debug Message')
app.logger.info('Info Message')
app.logger.warning('Warning Message')
app.logger.error('Error Message')
app.logger.critical('Critical ')

打印:

...
2020-10-26T14:13:27Z DEBUG 3197 ---- MainThread  test_log : <module> {test_log.py:77} Debug Message
2020-10-26T14:13:27Z INFO 3197 ---- MainThread  test_log : <module> {test_log.py:78} Info Message
2020-10-26T14:13:27Z WARNING 3197 ---- MainThread  test_log : <module> {test_log.py:79} Warning Message
2020-10-26T14:13:27Z ERROR 3197 ---- MainThread  test_log : <module> {test_log.py:80} Error Message
2020-10-26T14:13:27Z CRITICAL 3197 ---- MainThread  test_log : <module> {test_log.py:81} Critical 
...

0
对我来说有效的是:
应用程序内部的创建:
gunicorn_error_logger = logging.getLogger('gunicorn.error')
app.logger.handlers.extend(gunicorn_error_logger.handlers)
app.logger.setLevel(logging.DEBUG)
app.logger.debug('initialize gunicorn app logger')

还有一个路线内:

from flask import current_app

@main.route("/")
def home():
    current_app.logger.debug("THIS WILL BE IN THE GUNICORN LOG")

-3
请将您的Flask版本更新为1.0.2。这是一个使用app.logger在uwsgi-emperor和nginx后面的小例子:
def create_app(**kwargs):
    app = Flask(__name__)
    app.logger.setLevel(logging.DEBUG)

    @app.route('/ping/', methods=['GET'])
    def ping_pong():
        app.logger.critical('Healthcheck called')
        app.logger.error('Healthcheck called')
        app.logger.warning('Healthcheck called')
        app.logger.info('Healthcheck called')
        app.logger.debug('Healthcheck called')
        return jsonify({
            'status': 'Epic success',
            'message': 'pong!'
        })

所有日志消息都出现在syslog中:
[2018-05-14 08:43:33,778] CRITICAL in __init__: Healthcheck called
[2018-05-14 08:43:33,779] ERROR in __init__: Healthcheck called
[2018-05-14 08:43:33,779] WARNING in __init__: Healthcheck called
[2018-05-14 08:43:33,779] INFO in __init__: Healthcheck called
[2018-05-14 08:43:33,779] DEBUG in __init__: Healthcheck called

希望这有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接