NGINX / Gunicorn / Django-RQ:如何将每个rq-worker记录到不同的文件中

时间:2017-02-21 14:48:38

标签: python django logging redis django-rq

我们正在使用NGINX + Gunicorn + Django + RQ的架构,以及几个rq-worker。 我们使用基本的Django日志记录设置(如下),翻转和最大文件大小,但是:

  1. 创建的文件有时非常小 - 几个字节而不是定义的2MB
  2. 数字翻转文件与定义的文件不同。
  3. 问题:
    一个。知道为什么实际的文件创建数量和大小不同然后定义?
    湾是否可以使用翻转和最大文件大小策略将每个django rq-worker日志记录到不同的文件中?

    我们的日志记录设置:

    LOG_FILE_MAX_SIZE_MB = int(os.environ.get('log_file_max_size_mb', 1))
    LOG_FILES_ROTATE_NUM = int(os.environ.get('log_files_rotate_num', 8))
    
    log_file_dir = os.path.dirname(LOG_FILE_FULL_PATH)
    if not os.path.exists(log_file_dir):
        os.makedirs(log_file_dir, 0777)
    
    DATE_TIME_FORMAT = "%Y-%m-%d %H:%M:%S"
    VERBOSE_LINE_FORMAT = '%(asctime)s - %(levelname)s - %(process)d - %(thread)d     - %(filename)s - %(message)s'
    SIMPLE_LINE_FORMAT = '[%(levelname)-7s] %(asctime)s - %(message)s'
    
    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': VERBOSE_LINE_FORMAT,
            'datefmt': DATE_TIME_FORMAT
        },
        'simple': {
            'format': SIMPLE_LINE_FORMAT,
            'datefmt': DATE_TIME_FORMAT
        },
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose'
        },
        'fat_app_logfile': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'maxBytes': 1024*1024*LOG_FILE_MAX_SIZE_MB,
            'backupCount': LOG_FILES_ROTATE_NUM,
            'filename': LOG_FILE_FULL_PATH,
            'formatter': 'verbose'
        },
        'rq_app_logfile': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'maxBytes': 1024*1024*LOG_FILE_MAX_SIZE_MB,
            'backupCount': LOG_FILES_ROTATE_NUM,
            'filename': LOG_FILE_FULL_PATH,
            'formatter': 'verbose'
        },
    },
    'loggers': {
        'MainLogger': {
            'handlers': ['console', 'fat_app_logfile'],
            'propagate': True,
            'level': 'DEBUG',
        },
        'rq_scheduler': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': True,
        },
    }
    

    谢谢

1 个答案:

答案 0 :(得分:0)

问题出现在尝试使用标准日志记录(logging.handlers.RotatingFileHandler)不支持并发写入的多进程中,而是使用cloghandler.ConcurrentRotatingFileHandler解决了这个问题。

例如在django setting.py中:

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
# 'filters': {
#     'require_debug_false': {
#         '()': 'django.utils.log.RequireDebugFalse'
#     }
# },
'formatters': {
    'verbose': {
        'format': VERBOSE_LINE_FORMAT,
        'datefmt': DATE_TIME_FORMAT
    },
    'simple': {
        'format': SIMPLE_LINE_FORMAT,
        'datefmt': DATE_TIME_FORMAT
    },
},
'handlers': {
        'fat_app_logfile': {
        'level': 'DEBUG',
        'class': 'cloghandler.ConcurrentRotatingFileHandler',
        'maxBytes': 1024 * 1024 * LOG_FILE_MAX_SIZE_MB,
        'backupCount': LOG_FILES_ROTATE_NUM,
        'filename': LOG_FILE_FULL_PATH,
        'formatter': 'verbose'
    },

相关链接:here