2012-11-20 20 views
22

Tôi đang chạy gunicorn sau ngninx. Tôi muốn đăng nhập lỗi trong gunicorn để gunicorn-error.log và truy cập các bản ghi để gunicorn-access.log.Không thể nhận nhật ký truy cập để làm việc cho gunicorn

Tôi đã nhận được bản ghi lỗi nhưng không phải là nhật ký truy cập, tôi đang làm gì sai?

Đây là gunicorn.conf.py tôi:

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' 

Đây là kịch bản để chạy 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 

Nó tạo ra cả gunicorn-error.log và gunicorn-access.log nhưng chỉ gunicorn-error.log nhận bất kỳ nhật ký nào, ví dụ:

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 

Tôi đang làm gì sai? Bất kỳ ai cũng muốn chia sẻ gunicorn.conf.py hoạt động của họ với nhật ký lỗi và nhật ký truy cập?

Trả lời

18

Tôi đã thay đổi cấu hình đăng nhập của tôi trong Django để sau đây và nó giúp:

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, 
     }, 
    }, 
} 
+0

Cảm ơn! Có lẽ tốt hơn để có đăng nhập ở đó là tốt. – Mikael

+1

Vấn đề với điều này là các trình xử lý tệp không có nghĩa là được ghi vào nhiều quy trình. – dalore

+1

Chỉ cần fyi trong trường hợp bất cứ ai khác bị mắc kẹt về điều này, để xác định một lớp cụ thể cho một Formatter, khóa là '"() "' không "lớp", khóa lớp là cho xử lý. Đã đề cập [ở đây] (https://docs.python.org/2/library/logging.config.html#logging-config-dictschema) trong tài liệu. – danny

16

Xác định 'disable_existing_loggers': False trong logging.config.dictConfig công trình đối với tôi.

disable_existing_loggers - Nếu quy định như False, logger mà tồn tại khi cuộc gọi này được thực hiện còn lại một mình. Mặc định là True vì điều này cho phép hành vi cũ theo cách tương thích ngược. Hành vi này là vô hiệu hóa bất kỳ trình ghi nhật ký hiện có nào trừ khi chúng hoặc các tổ tiên của chúng được đặt tên rõ ràng trong cấu hình ghi nhật ký.

http://docs.python.org/2/library/logging.config.html#logging.config.fileConfig

Các vấn đề liên quan