Pourquoi mon gunicorn processus en ignorant le journal de réglage de niveau avec Django?
J'ai Nginx, Gunicorn, et Django, le tout fonctionnant sur le même Ubuntu instance EC2. J'ai un assez classiques de l'installation et que vous souhaitez vous connecter tous gunicorn les erreurs dans un fichier particulier.
Ma configuration pour Gunicorn est:
#!/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
Cependant, avec cette configuration, j'obtiens tous les journaux de DÉBOGAGE et au-dessus écrites dans le fichier. Mon journal de paramètre de niveau semble être ignoré.
Ce que je suis à la recherche est de seulement ces types de messages de journal écrit:
2014-01-02 13:54:53 [3327] [CRITICAL] WORKER TIMEOUT (pid:3338)
2014-01-02 13:54:53 [3327] [CRITICAL] WORKER TIMEOUT (pid:3338)
Je pensais que le Django de journalisation config spécifié dans mon settings.py peut-être interférer j'ai donc ajouté un gestionnaire et un enregistreur de frappe pour essayer et cible gunicorn mais cela ne fonctionne pas.
'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,
},
Voici les versions que je suis en cours d'exécution
Django 1.5.4
Nginx nginx/1.1.19
Gunicorn 18.0
Des pensées sur ce qui est le problème ici?
** Mise à jour **
Voici ce que mon django journalisation config ressemble:
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,
},
},
}
Les messages de DÉBOGAGE dans le fichier sont à venir à partir de Django.
Merci de poster l'intégralité de django de configuration de l'enregistrement, il pourrait être votre problème
OriginalL'auteur Dana Ford | 2014-01-02
Vous devez vous connecter pour publier un commentaire.
La
--log-level
réglage de gunicorn n'affecte gunicorns propre journalisation des erreurs de l'établissement. Mais l'erreur standard et la sortie standard de votre application va aussi se retrouver dans le gunicorn journal. Je pense que vous pourriez avoir unStreamHandler
quelque part dans votre Django journalisation config.StreamHandler
journaux àstderr
par défaut, de sorte qu'il se retrouve dans votre gunicorn journal. Supprimer laStreamHandler
ou d'augmenter le niveau pour résoudre votre problème.Sont ceux
IntegrityError
s pris par sentry? Sont-ils formatés comme votre journal habituel des messages? Si pas, ils pourraient se retrouver d'une autre manière sur votre stderr...Point intéressant. Après regardant de plus près tous les django journaux qui sont dans gunicorn sont les exceptions non traitées (c'est à dire que je ne suis pas explicitement de les manipuler dans le django code). Ainsi, par exemple IntegrityErrors, MultipleObjectsReturned, DoesNotExist, etc. Sentry attrape les exceptions de manière peut-être qu'ils sont à l'aide de StreamHandler derrière les coulisses. Je vais creuser profondément, merci pour les conseils.
En effet, le corbeau ajoute un
StreamHandler
certains enregistreurs qui ne sont pas gérées par sentry par défaut...Je suis confrontée au même problème. Lisez à propos de enregistreur de classe aussi, mais je n'ai pas idée précise sur la façon de résoudre le problème. Pour l'information, je suis en utilisant werkzeug wsgi avec le superviseur. voici mon superviseur de commande config
gunicorn --log-level=debug --logger-class=simple -b :3000 -k gevent -w 5 server:app
OriginalL'auteur sk1p