先上效果
优化前:

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

可以看到,每个日志输出的前面都带了具体的worker编号,并且woker编号和它对应的task名也会输出来,此外还输出了每个task的耗时。
方法也很简单
假设我们的项目名为demo
步骤1 修改 celery.py 文件
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 参数的值
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 删除。