python - 以编程方式生成/写入芹菜日志到文件中
问题描述
我正在尝试使用 celery 和 rabbitmq 作为消息代理运行一个简单的异步任务。我想以编程方式生成并写入终端中显示的芹菜日志到文件中。
我有一个任务文件,我在其中定义了我的任务,一个应用程序文件,我从中调用要执行的任务,并且我为所有文件配置和导入了我的日志记录。我正在尝试将我在日志配置中创建的日志对象导入到我的 celery 任务中,但由于某种原因,它不会生成日志。我还尝试了来自控制台的 -f LOGFILE, --logfile=LOGFILE 命令,该命令在推送时生成一个日志文件,但我想以编程方式生成它,就像常规日志记录发生的方式一样。我已经使用这个命令来运行我的 celery,它会在我运行它的控制台中生成日志——celery -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 日志不会以编程方式在我的日志文件中生成,只有当我们在控制台中发出 celery log 命令时才会在文件中生成它,而且它们也是不一致的。
解决方案
我建议使用after_setup_logger celery 装饰器,您可以在 celery 启动期间注册您的记录器。然后,您的记录器将在您的 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)
推荐阅读
- javascript - 循环在数组和另一个对象中的对象
- laravel - Laravel Nova - 在创建时将多行保存到数据库
- python - 如何提交虚拟环境
- c - 关于真实的表示可以假设什么?
- c# - MouseEnter 事件上的按钮背景没有动画
- java - 如何让片段在主活动中显示之前从服务中加载数据?
- node.js - 快递:当接受编码为“gzip,放气”时,req.body 为空
- swift - binding NSPopupbutton to an array of classes
- python - Reading columns from csv with no labels in Pandas
- java - Converting LinkedHashSet to ArrayList or just using ArrayList