3

私はログを次のように設定しています:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'mail_admins': {
            'level': 'INFO',
            'class': 'common.handlers.SuperAdminEmailHandler'
            },
        'console': {
            'level': 'INFO',
            'class': 'logging.StreamHandler'
            }
        },
    'loggers': {
        '': {
            'handlers': ['console'],
            'level': 'INFO',
            'propagate': True,
        },
        'django.request': {
            'handlers': ['console'],
            'level': 'ERROR',
            'propagate': True,
            },
        },
    }

とありCELERYD_HIJACK_ROOT_LOGGER = Falseます。私もこのタスクを持っています:

@periodic_task(run_every=crontab())
def test_logging():
    import logging
    print('running test_logging')
    logging.info("Here's an info message", extra = {
        'tell_admins': True, 'email_content': 'Additional content'
    })
    logging.error("Here's an error message")

test_logging を直接呼び出すテスト URL があります。その URL にアクセスすると、次の出力が表示されます。

running test_logging
Here's an info message
Here's an error message
[05/Jul/2013 11:07:27] "GET /test/ HTTP/1.1" 200 7

まさに私が期待するものです。ただし、同じ関数がセロリを介して実行されると、次のようになります。

Scheduler: Sending due task scheduler.tasks.test_logging (scheduler.tasks.test_logging)
running test_logging
Here's an error message

情報メッセージはどこへ行った?! 別のセロリ固有のロガーを追加してみました:

    'celery': {
        'handlers': ['console'],
        'level': 'INFO',
        'propagate': True,
        },

今、私はセロリからこれを見ます:

running test_logging
running test_logging
Here's an error message
Task scheduler.tasks.test_logging[271b8a4a-0c04-4391-81c5-5b009d70b08d] succeeded in 0.00929498672485s: None

まだ情報メッセージはありません。それを取り戻す理由と方法について何か考えはありますか?

4

2 に答える 2

3

何らかの理由で、Celery が Django のログ設定で指定した then ハンドラを使用している場合でも、ロガーのレベルをオーバーライドします。現在、この関数を使用してロガーを取得しています。ロガーが適切なレベルに設定されているため、期待どおりに動作しているようです。

import logging

from celery.utils.log import get_task_logger

def get_celery_logger(name):
    logger = get_task_logger(name)
    logger.level = logging.INFO
    return logger
于 2013-07-09T14:15:18.297 に答える
1

まず、使用する場合は、次のようdjango-celeryに実行してみてください。

./manage.py celeryd --loglevel=info

次に、Celery >= 3.0 を使用する場合は、ロガー オブジェクトを次のように取得する必要があります。

from celery.utils.log import get_task_logger


logger = get_task_logger(__name__)

# and inside your function use
# logger instead logging
@periodic_task(run_every=crontab())
def test_logging():
    print('running test_logging')
    logger.info("Here's an info message", extra = {
        'tell_admins': True, 'email_content': 'Additional content'
    })
    logger.error("Here's an error message")

うまくいかない場合は、LOGGIN オブジェクトを変更してみてください。

于 2013-07-05T18:10:26.373 に答える