首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >优化Django Celery的日志输出

优化Django Celery的日志输出

原创
作者头像
保持热爱奔赴山海
发布2025-12-22 21:13:38
发布2025-12-22 21:13:38
440
举报
文章被收录于专栏:DevOpsDevOps

先上效果

优化前:

这是我supervisor拉起的celery worker,它的日志文件中,可以看到输出了192.168.3.14 (这是某个task里面打的日志,实际生产环境日志量可能大很多倍),但是因为在生产环境中可能有N多个tasks在调度运行,根本无法定位到是哪个tasks输出的日志。

下面是优化后的效果:

可以看到,每个日志输出的前面都带了具体的worker编号,并且woker编号和它对应的task名也会输出来,此外还输出了每个task的耗时。

方法也很简单

假设我们的项目名为demo

步骤1 修改 celery.py 文件

代码语言:txt
复制
vim demo/demo/celery.py , 增加 app.conf.worker_task_log_format 相关的配置

我这里修改后的内容如下:

import os
import logging
import pymysql

pymysql.install_as_MySQLdb()
pymysql.version_info = (1, 4, 6, "final", 0)

from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'demo.settings')

app = Celery('demo')
logger = logging.getLogger(__name__)

app.config_from_object('django.conf:settings', namespace='CELERY')

app.autodiscover_tasks()

# 日志格式
app.conf.update(
    worker_log_format='[%(asctime)s: %(levelname)s/%(processName)s] %(message)s',
    worker_task_log_format='[%(asctime)s: %(levelname)s/%(processName)s] [%(task_name)s(%(task_id).8s)] %(message)s',
    worker_log_level='INFO',
)


@app.task(bind=True)
def debug_task(self):
    print(f'Request: {self.request!r}')

步骤2 修改 settings.py 文件,调整 disable_existing_loggers 参数的值

代码语言:txt
复制
vim demo/demo/settings.py

LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,  # 为了防止 Django 的 logging 配置覆盖掉 Celery 或其他第三方库已经配置好的 logger。
    ... 其余内容省略...

步骤3 重启django和celery相关进程即可

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档