我正在尝试使用celery和Rabbitmq作为消息代理来运行一个简单的异步任务。我想生成并以编程方式将终端中显示的芹菜日志写入文件。
我有一个任务文件,一个我定义了任务的应用程序文件,一个我要从中调用要执行的任务的文件,还有我为所有文件配置和导入的日志记录。我试图将在日志记录配置中创建的日志记录对象导入到celery Task中,但是由于某种原因,它不会生成日志。我还尝试了-f LOGFILE,--logfile = LOGFILE命令,该命令从控制台生成,该命令在推送时会生成日志文件,但我想以编程方式生成它,就像常规日志记录一样。我已经使用此命令来运行我的celery,该芹菜会从运行它的位置在控制台中生成日志-celery-一个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日志不会以编程方式在我的日志文件中生成,只有当我们在控制台中输入celery log命令时,它们才会在文件中生成,并且它们也是不一致的。
我建议使用after_setup_logger芹菜装饰器,您可以在其中启动celery期间注册记录器。然后,您的记录器将在您的芹菜任务中可用。
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)
celery信号@ after_setup_logger.connect将celery日志重定向到在celery启动时生成的文件,因此,如果您需要信息,则必须查看旧目录或文件并提取任务详细信息。如果不重新启动芹菜,则不可能在新文件中获得新的任务详细信息。