Python NGINX/Gunicorn/Django RQ:如何将每个RQ工作者记录到不同的文件

Python NGINX/Gunicorn/Django RQ:如何将每个RQ工作者记录到不同的文件,python,django,logging,redis,django-rq,Python,Django,Logging,Redis,Django Rq,我们正在使用NGINX+Gunicorn+Django+RQ的体系结构,有几个RQ工作人员。 我们使用基本的Django日志设置(如下),具有滚动和最大文件大小,但是: 创建的文件有时非常小,只有几个字节,而不是定义的2MB 滚动文件的数量与定义的不同 问题: A.知道为什么实际的文件创建数量和大小不同吗? B是否可以使用滚动和最大文件大小策略将每个django rq工作日志记录到不同的文件 我们的日志记录设置: LOG_FILE_MAX_SIZE_MB = int(os.environ.get

我们正在使用NGINX+Gunicorn+Django+RQ的体系结构,有几个RQ工作人员。 我们使用基本的Django日志设置(如下),具有滚动和最大文件大小,但是:

  • 创建的文件有时非常小,只有几个字节,而不是定义的2MB
  • 滚动文件的数量与定义的不同
  • 问题:
    A.知道为什么实际的文件创建数量和大小不同吗?
    B是否可以使用滚动和最大文件大小策略将每个django rq工作日志记录到不同的文件

    我们的日志记录设置:

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

    谢谢

    多进程试图使用标准日志记录(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'
        },
    

    相关链接:

    我启动并运行了ConcurrentRotatingFileHandler,但仍然只看到主进程的日志输出。