Uwsgi禁用了Django请求日志记录。

10

如果我使用uwsgi启动应用程序,我看不到与django.requests相关的日志。

但是,如果我在同一台机器上使用相同的代码启动应用程序

manage.py runserver 8080

它完美地运行。

有任何想法为什么会发生这种情况吗?

我通过这个命令运行uwsgi:

/home/gs/python-env/bin/uwsgi --ini /etc/uwsgi.d/uwsgi.ini --static-map /static=/home/gs/api/static/

uwsgi.ini

[uwsgi]
http-socket=:8080
home=/home/gs/python-env
chdir=/home/gs/api
module=server.wsgi
env=server.settings
processes=1
enable-threads=true

我的 settings.py 文件中的日志配置

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(process)d %(threadName)s %(module)s %(funcName)s %(message)s'
        }
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
        'file': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': '/var/log/gs/api.log',
            'formatter': 'verbose',
            'maxBytes': 1024 * 1024 * 16,  # 16Mb
        },
        'elasticsearch': {
            'level': 'DEBUG',
            'class': 'api.common.elasticsearch_log_handler.ElasticSearchHandler',
            'hosts': [{'host': cluster.ES_HOST, 'port': 443}],
            'es_index_name': 'logstash',
            'es_additional_fields': {'type': 'api', 'cluser': cluster.CLUSTER_NAME},
            'auth_type': ElasticSearchHandler.AuthType.NO_AUTH,
            'use_ssl': True,
        }
    },
    'loggers': {
       'django': {
            'handlers': ['file', 'elasticsearch', 'console'],
            'level': 'INFO',
            'propagate': True
        },
        'django.request': {
            'handlers': ['file', 'elasticsearch', 'console'],
            'level': 'DEBUG',
            'propagate':False
         }
    }
}
如果我将 "django" 的信息更改为 "debug",我将能够看到来自 django 记录器的日志,但无法看到来自 django.request 的日志。
更新:如果我编写自己的中间件,就可以记录请求。但我想知道为什么 django.request 在 uwsgi 上不起作用。

1
应该是 propagate,而不是 propagade。这可能会导致处理所有日志时出现问题。 - GwynBleidD
@GwynBleidD 谢谢你的纠正。虽然主要问题还没有解决...我也在另一台笔记本电脑上复制了这个问题。 - Artem Ibragimov
如果您已更改了代码,请在问题中也进行更改。另外,请尝试将'propagate': False更改为'propagate': True - GwynBleidD
1个回答

7
Django的runserver提供了在django.server下显示的日志信息。即使没有在runserver下运行,仍然可以将一些消息记录到django.request(主要是错误消息),但每个请求的信息日志消息只存在于runserver中。我通过查看uWSGI和Django源代码来验证了这一点。
如果您想要类似的日志消息,可以使用django-request-logging

谢谢你的回答。我想我终于实现了自己的日志中间件,这让我拥有了更多的灵活性。 - Artem Ibragimov

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