2

也许我的问题看起来很傻,但我不明白如何正确设置从 celery 任务到Sentry的日志记录。

例如,我有一个tasks.py包含两个任务的模块:foobar. 我想在任务中获取记录器并将所有消息直接发送到 Sentry,而不是文件logger.infologger.error

请告诉我它是如何正确完成的,如果你想要一些简单的例子。

4

2 回答 2

1

哨兵记录

或将 settings.py 中的日志记录配置替换为以下内容

LOGGING = {
  'version': 1,
  'disable_existing_loggers': True,

'formatters': {
    'console': {
        'format': '[%(asctime)s][%(levelname)s] %(name)s %(filename)s:%(funcName)s:%(lineno)d | %(message)s',
        'datefmt': '%H:%M:%S',
        },
    },

'handlers': {
    'console': {
        'level': 'DEBUG',
        'class': 'logging.StreamHandler',
        'formatter': 'console'
        },
    'sentry': {
        'level': 'ERROR',
        'class': 'raven.handlers.logging.SentryHandler',
        'dsn': 'http://public:secret@example.com/1',
        },
    },

'loggers': {
    '': {
        'handlers': ['console', 'sentry'],
        'level': 'DEBUG',
        'propagate': False,
        },
    'your_app': {
        'level': 'DEBUG',
        'propagate': True,
    },
   'celery': {
        'level': 'DEBUG',
        'handlers': ['sentry'],
        'propagate': False,
    },
}
}
于 2014-01-21T12:57:11.357 回答
0

这是我所做的并通过了我的烟雾测试。把它放在你的一个顶部tasks.py

@setup_logging.connect
def project_setup_logging(loglevel, logfile, format, colorize, **kwargs):
    import logging.config
    from django.conf import settings
    logging.config.dictConfigClass(settings.LOGGING).configure()

而我的相关settings.LOGGING

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,

    'formatters': {
        'standard': {
            'format': "[%(asctime)s] %(levelname)s [%(name)s.%(funcName)s:%(lineno)d] %(message)s",
            'datefmt': "%d/%b/%Y %H:%M:%S"
        },
    },

    'handlers': {
        'console': {
            'level': 'DEBUG',
            'formatter': 'standard',
            'stream': sys.stdout
        },
        'logfile': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': './django.log',
            'maxBytes': 1024*1024*5, # 5 MB
            'backupCount': 5,
            'formatter': 'standard',
        },
        'sentry': {
            'level': 'WARNING',
            'class': 'raven.contrib.django.raven_compat.handlers.SentryHandler',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['sentry'],
            'propagate': True,
            'level': 'ERROR',
        },
        'django.request': {
            'handlers': ['sentry'],
            'level': 'ERROR',
            'propagate': False,
        },
        'django.db.backends': {
            'handlers': ['sentry'],
            'level': 'ERROR',
            'propagate': False,
        },
        'raven': {
            'level': 'DEBUG',
            'handlers': ['console'],
            'propagate': False,
        },
        'sentry.errors': {
            'level': 'DEBUG',
            'handlers': ['console'],
            'propagate': False,
        },
        '': {
            'handlers': ['console', 'sentry', 'logfile'],
            'level': 'INFO',
        },
    }
}

然后我的测试是这个..

@celery.task()
def dummy_logging_test(**kwargs):
    """Call this as dummy_test.delay()"""
    from .models import User

    log = dummy_logging_test.get_logger()
    if settings.DEBUG:
        log.setLevel(logging.DEBUG)

    log.debug("Debug DUMMY TEST")
    log.info("Info DUMMY TEST")
    log.warning("Warning DUMMY TEST")
    log.error("Error DUMMY TEST")
    log.critical("Critical DUMMY TEST")

    try:
        User.objects.get(id=9999999)
    except Exception as err:
        log.exception(err)
        raise
于 2014-11-17T20:18:40.373 回答