Pytanie:
Chciałbym Seler złapać wyjątki i zapisać je w pliku dziennika zamiast widocznie ich połykania ...
Aktualnym top Odpowiedź tutaj jest tak dla celów profesjonalnego rozwiązania. Wielu deweloperów pythonów będzie uważało błąd zbiorczy za uchybiając na podstawie przypadku czerwoną flagę. Rozsądnym awersja do tego było dobrze sformułowana w komentarzu:
Hang On, będę oczekiwać tam być coś rejestrowane w dzienniku pracowników, przynajmniej dla każdego zadania, która nie ...
Seler łapie wyjątek, po prostu nie robi tego, co OP chciał z nim zrobić (przechowuje go w backend wyniku). Poniższy punkt widzenia jest najlepszy, jaki internet ma do zaoferowania w tym problemie. Jest trochę przestarzały, ale zanotuj liczbę widelców i gwiazd.
https://gist.github.com/darklow/c70a8d1147f05be877c3
Istotą bierze przypadek awarii i robi coś niestandardowego z nim. To jest nadzbiór problemu OP. Oto, jak dostosować rozwiązanie w celu zarejestrowania wyjątku.
import logging
logger = logging.getLogger('your.desired.logger')
class LogErrorsTask(Task):
def on_failure(self, exc, task_id, args, kwargs, einfo):
logger.exception('Celery task failure!!!1', exc_info=exc)
super(LogErrorsTask, self).on_failure(exc, task_id, args, kwargs, einfo)
trzeba jeszcze, aby sprawdzić, czy wszystkie zadania dziedziczą z tej klasy zadań, a sedno pokazuje, jak to zrobić, jeśli używasz @task
dekorator (z base=LogErrorsTask
kwarg).
Zaletą tego rozwiązania jest nie zagnieżdżanie kodu w dodatkowych kontekstach try-except. To jest niedozwolone na ścieżce kodu błędu, której już używa seler.
Czego chcesz od Seler? Nie mogłem się zawiesić jak aplikacja na komputer. Możesz użyć dwóch prostych sposobów. 1. Użyj funkcji backendu i zaznacz zadanie jako falled. 2. Owiń cały kod w selera, aby wypróbować wyjątek. – Rustem
@Rustem Chciałbym, aby Seler wychwycił wyjątki i zapisał je w pliku dziennika zamiast pozornie połknąć je ... –