也许我的问题看起来很愚蠢,但是我不明白如何正确设置从芹菜任务记录到 sentry 。
例如,我有一个具有两个任务的模块tasks.py
:foo
和bar
。我想将Logger内部完成任务,然后将所有logger.info
和logger.error
消息直接发送到Sentry,而不是文件。
请告诉我如何正确完成,如果您想使用一些简单的示例。
看哨兵记录
或用以下
替换设置中的记录配置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,
},
}
}
这是我所做的,并通过了我的烟雾测试。将其放在您的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