Celery Worker 在分离时不写入日志

sth*_*eli 5 python django celery

我有一个 Django 应用程序,我使用 celery 和rabbitmq 来执行异步任务。我已配置芹菜将日志写入文件,当我执行时

celery -A project_name -b <broker_url> worker -l INFO

一切工作正常,日志都打印在控制台和文件中。

但是,当我使用 -D 选项执行上述命令(即分离工作程序)时,该文件不再附加日志。

我的日志记录配置:

LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
    'standard': {
        'format': "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
        'datefmt': "%d/%b/%Y %H:%M:%S"
    },
},
'handlers': {
    'null': {
        'level': LOGGING_LEVEL,
        'class': 'logging.NullHandler',
    },
    'logfile': {
        'level': LOGGING_LEVEL,
        'class': 'logging.handlers.RotatingFileHandler',
        'filename': log_file_path,
        'maxBytes': 5000000,
        'backupCount': 2,
        'formatter': 'standard',
    },
    'console': {
        'level': LOGGING_LEVEL,
        'class': 'logging.StreamHandler',
        'formatter': 'standard'
    },
},
'loggers': {
    'django': {
        'handlers': ['console'],
        'propagate': True,
        'level': "WARNING",
    },
    'django.db.backends': {
        'handlers': ['console'],
        'level': "INFO",
        'propagate': False,
    },
    'celery': {
        'handlers': ['console', 'logfile'],
        'level': LOGGING_LEVEL,
    },
}}
Run Code Online (Sandbox Code Playgroud)

芹菜.py:

LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
    'standard': {
        'format': "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
        'datefmt': "%d/%b/%Y %H:%M:%S"
    },
},
'handlers': {
    'null': {
        'level': LOGGING_LEVEL,
        'class': 'logging.NullHandler',
    },
    'logfile': {
        'level': LOGGING_LEVEL,
        'class': 'logging.handlers.RotatingFileHandler',
        'filename': log_file_path,
        'maxBytes': 5000000,
        'backupCount': 2,
        'formatter': 'standard',
    },
    'console': {
        'level': LOGGING_LEVEL,
        'class': 'logging.StreamHandler',
        'formatter': 'standard'
    },
},
'loggers': {
    'django': {
        'handlers': ['console'],
        'propagate': True,
        'level': "WARNING",
    },
    'django.db.backends': {
        'handlers': ['console'],
        'level': "INFO",
        'propagate': False,
    },
    'celery': {
        'handlers': ['console', 'logfile'],
        'level': LOGGING_LEVEL,
    },
}}
Run Code Online (Sandbox Code Playgroud)

我是否缺少一些日志记录配置?

=============================================

更新

我已使用 TimedRotatingFileHandler 更改了日志文件处理程序,如下所示:

'logfile': {
            'level': LOGGING_LEVEL,
            'class': 'logging.handlers.TimedRotatingFileHandler',
            'filename': log_file_path,
            'when': 'D',  # this specifies the interval
            'interval': 1,  # defaults to 1, only necessary for other values
            'backupCount': 30,  # how many backup file to keep, 10 days
            'formatter': 'standard',
        }
Run Code Online (Sandbox Code Playgroud)

现在,我最终得到一个名为 logs_yyyyMMdd.logs 的文件,当我执行时:

   celery -A project_name -b <broker_url> worker -l INFO --logfile logs20210526.logs -D
Run Code Online (Sandbox Code Playgroud)

我可以看到文件中的日志。我的问题是当日子改变时会发生什么?为什么 celery 在使用 -D 执行时不使用日志配置?

sth*_*eli 5

我让它工作如下。

我在settings.py中创建了一个函数

def config_logging():
    timestamp = datetime.now().strftime('%Y%m%d')
    filename = f"logs_{timestamp}.log"
    log_file_path = join(LOGS_PATH, filename)
    logging_level = "DEBUG" if env("DEBUG") else "INFO"
    logging_config = {
        'version': 1,
        'disable_existing_loggers': True,
        'formatters': {
            'standard': {
                'format': "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
                'datefmt': "%d/%b/%Y %H:%M:%S"
            },
        },
        'handlers': {
            'null': {
                'level': logging_level,
                'class': 'logging.NullHandler',
            },
            'logfile': {
                'level': logging_level,
                'class': 'logging.handlers.TimedRotatingFileHandler',
                'filename': log_file_path,
                'when': 'D',  # this specifies the interval
                'interval': 1,  # defaults to 1, only necessary for other values
                'backupCount': 30,  # how many backup file to keep, 10 days
                'formatter': 'standard',
            },
            'console': {
                'level': logging_level,
                'class': 'logging.StreamHandler',
                'formatter': 'standard'
            },
        },
        'loggers': {
            'django': {
                'handlers': ['console'],
                'propagate': True,
                'level': "WARNING",
            },
            'django.db.backends': {
                'handlers': ['console'],
                'level': "INFO",
                'propagate': False,
            },
            'celery': {
                'handlers': ['console', 'logfile'],
                'level': logging_level,
            },
        }
    }
    dictConfig(logging_config)
    return filename, logging_config


log_filename, LOGGING = config_logging()
logger = logging.getLogger("celery")
Run Code Online (Sandbox Code Playgroud)

使用日志记录配置,然后在 celery.py 中我修改了代码:

@setup_logging.connect
def config_loggers(*args, **kwags):
    config_logging()


logger = logging.getLogger("celery")
Run Code Online (Sandbox Code Playgroud)

现在,即使工作人员已分离,我也可以看到文件中的日志。