|
11 | 11 |
|
12 | 12 | from celery.exceptions import SoftTimeLimitExceeded
|
13 | 13 | from celery.signals import (
|
14 |
| - after_setup_logger, task_failure, task_prerun, task_postrun |
15 |
| -) |
| 14 | + after_setup_logger, after_setup_task_logger, |
| 15 | + task_failure, task_prerun, task_postrun) |
16 | 16 | from raven.handlers.logging import SentryHandler
|
17 | 17 |
|
18 | 18 |
|
@@ -46,10 +46,28 @@ def process_logger_event(sender, logger, loglevel, logfile, format,
|
46 | 46 | if isinstance(h, SentryHandler):
|
47 | 47 | h.addFilter(filter_)
|
48 | 48 | return False
|
| 49 | + logger.addHandler(handler) |
49 | 50 |
|
| 51 | + def fix_task_logger(sender, logger=None, **kwargs): |
| 52 | + # If the task logger is set up to not propagate (as Celery is bound |
| 53 | + # to do), give it a SentryHandler from a parent logger. However, if |
| 54 | + # no parent is using Sentry, the task logger should not, either. |
| 55 | + if not logger or logger.propagate: |
| 56 | + return |
| 57 | + if any(isinstance(h, SentryHandler) for h in logger.handlers): |
| 58 | + return |
50 | 59 | logger.addHandler(handler)
|
51 | 60 |
|
52 |
| - after_setup_logger.connect(process_logger_event, weak=False) |
| 61 | + after_setup_logger.connect( |
| 62 | + process_logger_event, |
| 63 | + weak=False, |
| 64 | + dispatch_uid='raven.contrib.celery.process_logger_event', |
| 65 | + ) |
| 66 | + after_setup_task_logger.connect( |
| 67 | + fix_task_logger, |
| 68 | + weak=False, |
| 69 | + dispatch_uid='raven.contrib.celery.fix_task_logger', |
| 70 | + ) |
53 | 71 |
|
54 | 72 |
|
55 | 73 | class SentryCeleryHandler(object):
|
|
0 commit comments