私はngninxの背後でgunicornを実行しています。 gunicornのエラーをgunicorn-error.logに、アクセスログをgunicorn-access.logに記録します。
エラーログは機能していますが、アクセスログは機能しません。何が問題なのですか?
これは私のgunicorn.conf.pyです:
bind = '127.0.0.1:8888'
backlog = 2048
workers = 3
errorlog = '/home/my/logs/gunicorn-error.log'
accesslog = '/home/my/logs/gunicorn-access.log'
loglevel = 'debug'
proc_name = 'gunicorn-my'
pidfile = '/var/run/my.pid'
これは、gunicornを実行するスクリプトです。
#!/bin/bash
set -e
ENV=/home/my/env/bin/activate
GUNICORN=gunicorn_Django
SETTINGS_PATH=/home/my/app/app/settings
PROJECT_PATH=/home/my/app
CONFROOT=/home/my/app/conf/gunicorn.conf.py
cd $SETTINGS_PATH
source $ENV
export PYTHONPATH=$PROJECT_PATH
exec $GUNICORN app.settings.staging -c $CONFROOT
これは、gunicorn-error.logとgunicorn-access.logの両方を作成しますが、gunicorn-error.logのみがログを取得します。例:
2012-11-20 11:49:57 [27817] [INFO] Starting gunicorn 0.14.6
2012-11-20 11:49:57 [27817] [DEBUG] Arbiter booted
2012-11-20 11:49:57 [27817] [INFO] Listening at: http://127.0.0.1:8888 (27817)
2012-11-20 11:49:57 [27817] [INFO] Using worker: sync
2012-11-20 11:49:58 [27825] [INFO] Booting worker with pid: 27825
2012-11-20 11:49:58 [27828] [INFO] Booting worker with pid: 27828
2012-11-20 11:49:58 [27830] [INFO] Booting worker with pid: 27830
何が悪いのですか?誰かがエラーログとアクセスログで作業中のgunicorn.conf.pyを共有したいですか?
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'
},
'generic': {
'format': '%(asctime)s [%(process)d] [%(levelname)s] %(message)s',
'datefmt': '%Y-%m-%d %H:%M:%S',
'()': 'logging.Formatter',
},
},
'handlers': {
'sentry': {
'level': 'ERROR',
'class': 'raven.contrib.Django.handlers.SentryHandler',
},
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'verbose'
},
'error_file': {
'class': 'logging.FileHandler',
'formatter': 'generic',
'filename': '/home/fungine/gunicorn.error.log',
},
'access_file': {
'class': 'logging.FileHandler',
'formatter': 'generic',
'filename': '/home/fungine/gunicorn.access.log',
},
},
'loggers': {
'Django.db.backends': {
'level': 'ERROR',
'handlers': ['console'],
'propagate': False,
},
'raven': {
'level': 'DEBUG',
'handlers': ['console'],
'propagate': False,
},
'sentry.errors': {
'level': 'DEBUG',
'handlers': ['console'],
'propagate': False,
},
'gunicorn.error': {
'level': 'INFO',
'handlers': ['error_file'],
'propagate': True,
},
'gunicorn.access': {
'level': 'INFO',
'handlers': ['access_file'],
'propagate': False,
},
},
}
'disable_existing_loggers': False
でlogging.config.dictConfig
を指定するとうまくいきます。
disable_existing_loggers–
False
として指定すると、この呼び出しが行われたときに存在するロガーはそのまま残されます。デフォルトはTrue
です。これにより、下位互換性のある方法で古い動作が可能になります。この動作は、ロギング構成で明示的に名前が付けられていない限り、既存のロガーを無効にすることです。
http://docs.python.org/2/library/logging.config.html#logging.config.fileConfig