在与 'normal' Django 日志相同的位置获取 Celery 日志,并使用 Django 格式化程序进行格式化
Get Celery logs in the same place as 'normal' Django logs and formatted by a Django formatter
我试图找到一种方法来收集通过 Celery 调用的异步函数内部生成的日志,在我用来记录 'non-celery' django 函数的同一个处理程序中。
我创建了一个虚拟函数,每 3 秒发送一条日志:
from celery.decorators import periodic_task
from datetime import timedelta
@periodic_task(run_every=timedelta(seconds=3))
def every_3_seconds():
logr.debug("Hello world: Running (debug) periodic task!")
logr.info("Hello world: Running (info) periodic task!")
我也尝试过这样的事情:
clogger = get_task_logger(__name__) # Celery logger
@periodic_task(run_every=timedelta(seconds=3))
def every_3_seconds():
clogger.debug("HelloCelery: Running (debug) periodic task!")
clogger.info("HelloCelery: Running (info) periodic task!")
日志设置是(注释是我以前的尝试):
CELERYD_HIJACK_ROOT_LOGGER = False
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'formatter': 'verbose',
},
},
'formatters': {
'verbose': {
'format': 'HOPLA123 %(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
}
},
'loggers': {
'': {
'handlers': ['console'],
'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'),
},
# 'django': {
# 'handlers': ['console'],
# 'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'),
# },
# # Logger for the myappApp
# # Use: logr = logging.getLogger(__name__) in myappApp
# # logr.debug("....")
# 'myappApp': {
# 'handlers': ['console'],
# 'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'),
# 'propagate': False, # To fix duplicate log issue.
# },
# # Default Python Logger
# 'root': {
# 'handlers': ['console'],
# 'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'),
# },
# 'celery': {
# 'handlers': ['console'],
# 'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'),
# 'propagate': True,
# },
},
}
我有一个 supervisord 配置,可以在合适的文件中输出每个日志:
[program:gunicorn_django]
environment=PYTHONPATH=/opt/myapp/myappServer/myappServer
command = /opt/myapp/venv/bin/gunicorn wsgi -b 0.0.0.0:8000 --timeout 90 --access-logfile /dev/stdout --error-logfile /dev/stderr
directory = /opt/myapp/myappServer
user = root
autostart=true
autorestart=true
stdout_logfile=/var/log/gunicorn.log
stderr_logfile=/var/log/gunicorn.err
[program:redis]
command=redis-server
autostart=true
autorestart=true
stdout_logfile=/var/log/redis.log
stderr_logfile=/var/log/redis.err
[program:django-celery]
command=/opt/myapp/venv/bin/python ./manage.py celery --app=myappServer.celeryapp:app worker -B --loglevel=INFO
directory=/opt/myapp/myappServer
numprocs=1
stdout_logfile=/var/log/celery.log
stderr_logfile=/var/log/celery.err
autostart=true
autorestart=true
startsecs=10
Celery 函数中我的 Hello world 日志记录到 /var/log/celery.err,如 Celery 文档中所述:
If no logfile is specified, stderr is used.
我想将它们放在 /var/log/gunicorn.log 中,主要由 verbose 格式化程序 (以便之后由 LogStash 实例正确解释)。我的记录器定义有问题吗?
回答自己:
我的问题中的代码确实有效。
好像是:
CELERYD_HIJACK_ROOT_LOGGER = False
成功了。
我试图找到一种方法来收集通过 Celery 调用的异步函数内部生成的日志,在我用来记录 'non-celery' django 函数的同一个处理程序中。
我创建了一个虚拟函数,每 3 秒发送一条日志:
from celery.decorators import periodic_task
from datetime import timedelta
@periodic_task(run_every=timedelta(seconds=3))
def every_3_seconds():
logr.debug("Hello world: Running (debug) periodic task!")
logr.info("Hello world: Running (info) periodic task!")
我也尝试过这样的事情:
clogger = get_task_logger(__name__) # Celery logger
@periodic_task(run_every=timedelta(seconds=3))
def every_3_seconds():
clogger.debug("HelloCelery: Running (debug) periodic task!")
clogger.info("HelloCelery: Running (info) periodic task!")
日志设置是(注释是我以前的尝试):
CELERYD_HIJACK_ROOT_LOGGER = False
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'formatter': 'verbose',
},
},
'formatters': {
'verbose': {
'format': 'HOPLA123 %(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
}
},
'loggers': {
'': {
'handlers': ['console'],
'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'),
},
# 'django': {
# 'handlers': ['console'],
# 'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'),
# },
# # Logger for the myappApp
# # Use: logr = logging.getLogger(__name__) in myappApp
# # logr.debug("....")
# 'myappApp': {
# 'handlers': ['console'],
# 'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'),
# 'propagate': False, # To fix duplicate log issue.
# },
# # Default Python Logger
# 'root': {
# 'handlers': ['console'],
# 'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'),
# },
# 'celery': {
# 'handlers': ['console'],
# 'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'),
# 'propagate': True,
# },
},
}
我有一个 supervisord 配置,可以在合适的文件中输出每个日志:
[program:gunicorn_django]
environment=PYTHONPATH=/opt/myapp/myappServer/myappServer
command = /opt/myapp/venv/bin/gunicorn wsgi -b 0.0.0.0:8000 --timeout 90 --access-logfile /dev/stdout --error-logfile /dev/stderr
directory = /opt/myapp/myappServer
user = root
autostart=true
autorestart=true
stdout_logfile=/var/log/gunicorn.log
stderr_logfile=/var/log/gunicorn.err
[program:redis]
command=redis-server
autostart=true
autorestart=true
stdout_logfile=/var/log/redis.log
stderr_logfile=/var/log/redis.err
[program:django-celery]
command=/opt/myapp/venv/bin/python ./manage.py celery --app=myappServer.celeryapp:app worker -B --loglevel=INFO
directory=/opt/myapp/myappServer
numprocs=1
stdout_logfile=/var/log/celery.log
stderr_logfile=/var/log/celery.err
autostart=true
autorestart=true
startsecs=10
Celery 函数中我的 Hello world 日志记录到 /var/log/celery.err,如 Celery 文档中所述:
If no logfile is specified, stderr is used.
我想将它们放在 /var/log/gunicorn.log 中,主要由 verbose 格式化程序 (以便之后由 LogStash 实例正确解释)。我的记录器定义有问题吗?
回答自己: 我的问题中的代码确实有效。
好像是:
CELERYD_HIJACK_ROOT_LOGGER = False
成功了。