【问题标题】:Django Celery change log file on run time运行时 Django Celery 更改日志文件
【发布时间】:2016-08-30 22:22:03
【问题描述】:

=========================最后更新===================== ====
我找到了 Celery Signal worker_process_init.connect(some_function)
这允许我在工人 child 开始运行之前运行我想要的任何功能,在我的情况下,我可以根据需要更改日志处理程序...

handler = logging.FileHandler(('my%s.log')%current_process().index, 'a')
logger.addHandler(handler)

(我发现的另一个信号 - setup_log 在我的情况下效率不高。)
++++++++++++++++++++++++++++ 更新 ++++++++++++++++++++++++++++
我将句柄从我的 settings.py 中移出,因为我知道它只加载了一次,所以现在它在 task.py 中定义:

def custom_logger(name):
    logger = logging.getLogger(name)
    logger.setLevel(logging.DEBUG)
    handler = logging.FileHandler(('my%s.log')%current_process().index, 'a')
    logger.addHandler(handler)
return logger

例如任务:

@tenant_celery.task(base=HandlersImplTenantTask)
@concurrent_task(task_timeout=1)
def add():
    task_id = add.request.id
    l = custom_logger(task_id)
    l.info("task name is -   ADD")
    l.info("my worker id is: %s" % current_process().index)
return 5+7

不是最美观的解决方案,但确实有效- 在运行时更改日志文件..

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

我正在通过 Django 运行 Celery 任务,

我希望每个 celery worker 写入不同的日志文件,

但每次都是同一个-->

例如:worker 1 -->myLog1.log ,worker 2 -->myLog2.log

这就是我的 settings.py 的样子:

logfile = '%s/%s' % (logdir, APP_NAME + "-" + process_name + '.log')
CELERY_WORKER_LOGFILE = '%s/%s' % (logdir, 'celery_worker.log')

和task.py:

@tenant_celery.task(base=HandlersImplTenantTask)
def get_worker_id():
    logdir = '%s/%s' % (os.curdir, 'log')
    settings.CELERY_WORKER_LOGFILE = '%s/%s-%s.log' % (logdir, 'celery_worker', current_process().index)
    print settings.CELERY_WORKER_LOGFILE
    # print the new log file
    logger.info("HELLO FROM TASK %s", current_process().index)
    #  write to the wrong logfile.

我的第二个任务也是如此。

但尽管它在每个任务中打印不同的“LOFFILE”,

它会一直写入与 settings.py 中相同的日志 (!!)。

我的运行命令是:

celery worker -c 2 --broker=amqp://1000:1000@localhost:5672//1000

有没有办法(真的)在运行时更改日志文件??

(我不明白Django log signals能不能帮到我)

我也找到了THIS 的答案,但它对我不起作用..

谢谢

【问题讨论】:

    标签: python django runtime celery


    【解决方案1】:

    您知道,在运行 worker 时,您可以通过如下参数指定日志文件:

    celery -A proj worker -l info -f paht/to/yourfile.log
    

    更多关于official doc

    【讨论】:

    • 感谢您的回答,但由于我正在使用多进程,因此更改正在运行的命令会出现问题。还是我错过了什么?谢谢
    • 您的意思是您使用的是 celery multi ?还是 init.d 脚本?在这两种情况下,您都可以为每个工作人员指定选项。
    • 我的意思是我正在使用这个命令:celery worker -c 5 --broker=amqp://1000:1000@localhost:5672//1000。
      所以我不能每次都配置日志文件。我错了吗?
    • 您好,您正在使用 1 个并发 5 的工作人员。只需使用 celery multi 午餐 5 个不同的工作人员,并发 1 和不同的日志文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多