以编程方式生成/写入芹菜日志到文件中



我正在尝试使用芹菜和兔子mq作为消息代理运行一个简单的异步任务。我想以编程方式生成终端中显示的芹菜日志并将其写入文件。

我有一个任务文件,其中定义了我的任务,一个应用程序文件,我从中调用要执行的任务,并且我还为所有文件配置和导入了日志记录。我正在尝试将在日志记录配置中创建的日志记录对象导入到我的芹菜任务,但由于某种原因,它不会生成日志。我还尝试了控制台中的 -f LOGFILE, --logfile=LOGFILE 命令,该命令在推送时生成日志文件,但我想以编程方式生成它,就像常规日志记录发生的那样。我已经使用此命令来运行我的芹菜,它在我运行它的控制台中生成日志—— 芹菜 -A taskhandler.celery_app worker -l info -E --concurrency = 1。 Celery 无法读取和处理项目的日志记录对象,也无法生成到我提供的路径的日志。 我也尝试过这些: https://www.distributedpython.com/2018/08/28/celery-logging/http://docs.celeryproject.org/en/latest/userguide/tasks.html#logging

但我还没有达成任何解决方案。

import time
from celery.utils.log import get_task_logger
from log import Logger
from taskhandler.celery_app import celery
#logger = get_task_logger(__name__)
logger = Logger.get_logger()

@celery.task(task_ignore_result=False, track_started=True)
def train_global_trepan_task(count):
factor = 1
for i in range(1, count + 1):
factor = factor * i
time.sleep(5)
logger.info("Task id {} factorial of {} is {}".format(train_global_trepan_task.request.id, i, factor))
return factor

下面是日志记录设置

import logging
from datetime import date
from configuration import get_config
import sys
sys.path.append("..")
class Logger:
_logger = None
@classmethod
def get_logger(cls):
name = 'logs//' + date.today().strftime("%b-%d-%Y") + '.log'
if not cls._logger or name != cls._logger.__dict__['name']:
logging.basicConfig(filename=name,
filemode='a',
format='%(asctime)s [%(filename)s - %(lineno)s] -%(funcName)s - %(levelname)s - %('
'message)s')
cls._logger = logging.getLogger(name)
log_level = {
'debug': logging.DEBUG,
'info': logging.INFO,
'error': logging.ERROR,
'warning': logging.WARNING,
'critical': logging.CRITICAL,
}[get_config('logger', 'level').lower()]
cls._logger.setLevel(log_level)
return cls._logger

预期结果: 芹菜日志应该在我的日志文件夹中生成,这是提供给它的路径。 实际结果:Celery 日志不会以编程方式在我的日志文件中生成,只有当我们在控制台中给出 celery log 命令时,它才会在文件中生成,而且它们也不一致。

我建议使用after_setup_logger芹菜装饰器,您可以在芹菜启动期间注册记录器。 然后,您的记录器将在您的芹菜任务中可用。

from celery.signals import after_setup_logger
@after_setup_logger.connect
def setup_loggers(logger, *args, **kwargs):
import logging
fh = logging.FileHandler('/path/to/file')
logger = logging.getLogger("test-logger")
logger.addHandler(fh)

芹菜信号 @after_setup_logger.connect 将芹菜日志记录重定向到芹菜启动时生成的文件,因此,如果您需要信息,则必须查看旧目录或文件并提取任务详细信息。如果不重新启动芹菜,则无法在新文件中获取新的任务详细信息。

最新更新