【问题标题】:Get Celery logs in the same place as 'normal' Django logs and formatted by a Django formatter在与“普通”Django 日志相同的位置获取 Celery 日志并由 Django 格式化程序进行格式化
【发布时间】:2017-06-18 07:05:48
【问题描述】:

我试图找到一种方法来收集从通过 Celery 调用的异步函数内部生成的日志,在我用来记录“非 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 文档中所述:

如果没有指定日志文件,则使用stderr。

我希望将它们放在 /var/log/gunicorn.log 中,主要由 verbose 格式化程序进行格式化(以便由之后的 LogStash 实例)。我的记录器的定义有问题吗?

【问题讨论】:

    标签: django logging celery supervisord


    【解决方案1】:

    回答我自己: 我的问题中的代码确实有效。

    看来:

    CELERYD_HIJACK_ROOT_LOGGER = False
    

    成功了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-31
      • 2017-04-29
      • 2015-04-21
      相关资源
      最近更新 更多