gpt4 book ai didi

python - 为什么我的 gunicorn 进程会忽略 Django 的日志级别设置?

转载 作者:太空狗 更新时间:2023-10-30 00:07:20 28 4
gpt4 key购买 nike

我有 Nginx、Gunicorn 和 Django 都在同一个 Ubuntu EC2 实例上运行。我有一个相当传统的设置,并且想将所有 gunicorn 错误记录到一个特定的文件中。

我的 Gunicorn 配置是:

#!/bin/bash

NAME="server"
GUNICORNDIR=/ebs/env/bin
DJANGODIR=/ebs/server/
SOCKFILE=/tmp/gunicorn.sock
LOGFILE=/var/log/gunicorn/gunicorn.error
USER=ubuntu
GROUP=ubuntu
NUM_WORKERS=5
TIMEOUT=60
DJANGO_SETTINGS_MODULE=settings
DJANGO_WSGI_MODULE=wsgi

echo "Starting $NAME"

RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR

exec $GUNICORNDIR/gunicorn ${DJANGO_WSGI_MODULE}:application \
--name $NAME \
--workers $NUM_WORKERS \
--timeout=$TIMEOUT \
--user=$USER --group=$GROUP \
--log-level=error --log-file=$LOGFILE \
--bind=unix:$SOCKFILE

然而,通过这种配置,我将所有来自 DEBUG 及以上的日志写入文件。我的日志级别参数似乎被忽略了。

我正在寻找的是只写入这些类型的日志消息:

2014-01-02 13:54:53 [3327] [CRITICAL] WORKER TIMEOUT (pid:3338)
2014-01-02 13:54:53 [3327] [CRITICAL] WORKER TIMEOUT (pid:3338)

我认为我的 settings.py 中指定的 Django 日志记录配置可能会产生干扰,因此我添加了一个处理程序和一个记录器来尝试以 gunicorn 为目标,但这没有用。

'handlers': {
'gunicorn': {
'level': 'ERROR',
'class': 'logging.handlers.RotatingFileHandler',
'formatter': 'verbose',
'filename': '/ebs/log/gunicorn.error',
'maxBytes': 1024 * 1024 * 100,
},
}
'loggers': {
'gunicorn.errors': {
'level': 'ERROR',
'handlers': ['gunicorn'],
'propagate': False,
},

这是我正在运行的版本

Django 1.5.4Nginx nginx/1.1.19 unicorn 18.0

对这里有什么问题有什么想法吗?

** 更新**

这是我的 Django 日志配置的样子:

LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'root': {
'level': 'WARNING',
'handlers': ['sentry'],
},
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
},
'simple': {
'format': '%(levelname)s %(asctime)s -- %(message)s'
}
},
'handlers': {
'sentry': {
'level': 'ERROR',
'class': 'raven.contrib.django.raven_compat.handlers.SentryHandler',
},
'sentry_file': {
'level': 'ERROR',
'class': 'logging.handlers.RotatingFileHandler',
'formatter': 'verbose',
'filename': '/ebs/log/sentry_log.txt',
'maxBytes': 1024 * 1024 * 100, # 100 mb
},
'celery': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'filename': '/ebs/log/celery/celery.log',
'formatter': 'verbose',
'maxBytes': 1024 * 1024 * 100,
},
'apps': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'formatter': 'verbose',
'filename': '/ebs/log/apps.log',
'maxBytes': 1024 * 1024 * 100,
},
'apps.dss': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'formatter': 'verbose',
'filename': '/ebs/log/dss_apps.log',
'maxBytes': 1024 * 1024 * 100,
},

},
'loggers': {
'django.db.backends': {
'level': 'DEBUG',
'handlers': ['sentry'],
'propagate': False,
},
'sentry': {
'level': 'DEBUG',
'handlers': ['sentry'],
'propagate': False,
},
'sentry.errors': {
'level': 'ERROR',
'handlers': ['sentry_file', 'sentry'],
'propagate': False,
},
'celery': {
'level': 'INFO',
'handlers': ['sentry', 'celery'],
'propagate': False
},
'apps': {
'level': 'DEBUG',
'handlers': ['apps', 'sentry'],
'propagate': False
},
'apps.dss' : {
'level': 'DEBUG',
'handlers': ['apps.dss', 'sentry'],
'propagate': False,
},
},
}

最佳答案

gunicorn 的 --log-level 设置只影响 gunicorn 自己的错误记录工具。但是您的应用程序的标准错误和标准输出最终也会出现在 gunicorn 日志中。我想你可能有一个 StreamHandler在你的 Django 日志记录配置中的某个地方。 StreamHandler 默认记录到 stderr,所以它最终会出现在你的 gunicorn 日志中。删除 StreamHandler 或提高级别以解决您的问题。

关于python - 为什么我的 gunicorn 进程会忽略 Django 的日志级别设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20884859/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com