Wysyłanie wiadomości logów ze wszystkich zadań selery do jednego pliku
Zastanawiam się, jak skonfigurować bardziej szczegółowy system logowania. Wszystkie moje zadania używają
logger = logging.getLogger(__name__)
Jako rejestrator całego modułu.
Chcę, aby selery logował się do " celeryd.Zaloguj "i Moje zadania do" zadań.log", ale nie mam pojęcia jak to uruchomić. Używając {[1] } z django-selery mogę przekierować wszystkie wiadomości dziennika związane z celeryd do celeryd.log ale nie ma śladu komunikatów dziennika utworzonych w moich zadaniach.
2 answers
Uwaga: Ta odpowiedź jest nieaktualna od wersji 3.0, w której teraz używasz get_task_logger()
Aby skonfigurować rejestrator zadań. Zobacz sekcję logowania w dokumencie co nowego w selery 3.0 , Aby uzyskać szczegółowe informacje.
Seler posiada dedykowane wsparcie dla logowania, dla każdego zadania. Zobacz dokumentacja zadania na temat :
Możesz użyć rejestratora workers, aby dodać wyjście diagnostyczne do dziennika Workers:]}@celery.task() def add(x, y): logger = add.get_logger() logger.info("Adding %s + %s" % (x, y)) return x + y
Są dostępnych jest kilka poziomów logowania, a o ustawieniu poziomu logowania pracowników decyduje czy zostaną zapisane do pliku dziennika.
Oczywiście, możesz również po prostu użyć print, ponieważ wszystko, co jest napisane do standardowego out / - err, będzie zapisany również do pliku dziennika.
Pod maską to wszystko jest nadal standardowym modułem logowania Pythona. Możesz ustawić CELERYD_HIJACK_ROOT_LOGGER
option to False, aby umożliwić działanie własnej konfiguracji logowania, w przeciwnym razie selery skonfiguruje obsługę dla Ciebie.
Jednak w przypadku zadań, wywołanie .get_logger()
pozwala na utworzenie osobnego pliku dziennika dla poszczególnych zadań. Po prostu podaj argument logfile
i przekieruje komunikaty dziennika do oddzielnego pliku:
@celery.task()
def add(x, y):
logger = add.get_logger(logfile='tasks.log')
logger.info("Adding %s + %s" % (x, y))
return x + y
Last but not least, you can just configure your top-level package in the Python logging module and give it a file handler of it ' s own. Skonfigurowałbym to używając sygnału celery.signals.after_setup_task_logger
; tutaj zakładam, że wszystkie Twoje Moduły żyją w pakiecie o nazwie foo.tasks
(jak w foo.tasks.email
i foo.tasks.scaling
):
from celery.signals import after_setup_task_logger
import logging
def foo_tasks_setup_logging(**kw):
logger = logging.getLogger('foo.tasks')
if not logger.handlers:
handler = logging.FileHandler('tasks.log')
formatter = logging.Formatter(logging.BASIC_FORMAT) # you may want to customize this.
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.propagate = False
after_setup_task_logger.connect(foo_tasks_setup_logging)
Teraz każdy logger, którego nazwa zaczyna się od foo.tasks
będzie miał wszystkie wiadomości wysyłane do tasks.log
zamiast do głównego loggera(który nie widzi żadnej z tych wiadomości, ponieważ {[13] } jest False).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-01 12:31:36
Tylko podpowiedź: seler ma swój własny handler logowania:
from celery.utils.log import get_task_logger
logger = get_task_logger(__name__)
Ponadto seler rejestruje wszystkie dane wyjściowe z zadania. Więcej szczegółów w selery docs for Task Logging
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-21 13:19:36