Development Tip

모든 셀러리 작업의 로그 메시지를 단일 파일로 전송

yourdevel 2020. 11. 21. 09:09
반응형

모든 셀러리 작업의 로그 메시지를 단일 파일로 전송


더 구체적인 로깅 시스템을 설정하는 방법이 궁금합니다. 내 모든 작업은

logger = logging.getLogger(__name__)

모듈 전체의 로거로.

셀러리가 "celeryd.log"에 기록하고 내 작업을 "tasks.log"에 기록하고 싶지만이 작업을 수행하는 방법을 모르겠습니다. CELERYD_LOG_FILEdjango-celery에서 사용하면 모든 celeryd 관련 로그 메시지를 celeryd.log로 라우팅 할 수 있지만 내 작업에서 생성 된 로그 메시지의 흔적은 없습니다.


참고 :이 답변은 이제 get_task_logger()작업 별 로거를 설정하는 데 사용 하는 Celery 3.0에서 구식 입니다. 자세한 내용 은 Celery 3.0의 새로운 기능 문서의 로깅 섹션 을 참조하십시오.


Celery는 작업별로 로깅을 전담 지원합니다. 주제에 대한 태스크 문서를 참조하십시오 .

작업자 로거를 사용하여 작업자 로그에 진단 출력을 추가 할 수 있습니다.

@celery.task()
def add(x, y):
    logger = add.get_logger()
    logger.info("Adding %s + %s" % (x, y))
    return x + y

몇 가지 로깅 수준을 사용할 수 있으며 작업자 로그 수준 설정은 로그 파일에 기록할지 여부를 결정합니다.

물론 표준 출력 / 오류에 기록 된 모든 내용이 로그 파일에도 기록되므로 단순히 print를 사용할 수도 있습니다.

내부적으로 이것은 모두 여전히 표준 파이썬 로깅 모듈입니다. 당신은 설정할 수있는 CELERYD_HIJACK_ROOT_LOGGER옵션을 달리 셀러리 당신을위한 처리를 구성합니다 작업에 자신의 로깅 설정을 허용 false로한다.

그러나 작업의 경우 .get_logger()호출을 통해 개별 작업별로 별도의 로그 파일을 설정할 수 있습니다. 단순히 logfile인수를 전달하면 로그 메시지를 별도의 파일로 라우팅합니다.

@celery.task()
def add(x, y):
    logger = add.get_logger(logfile='tasks.log')
    logger.info("Adding %s + %s" % (x, y))
    return x + y 

마지막으로, 파이썬 로깅 모듈 에서 최상위 패키지를 구성 하고 자체 파일 처리기를 제공 할 수 있습니다. celery.signals.after_setup_task_logger신호를 사용하여 이것을 설정했습니다 . 여기에서는 모든 모듈이 foo.tasks(및에서 foo.tasks.email와 같이 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)

이제 이름이로 시작하는 foo.tasks모든 tasks.log로거는 루트 로거 대신 전송 된 모든 메시지를 갖게 됩니다 ( .propagateFalse 이기 때문에 이러한 메시지를 볼 수 없음 ).


힌트 : Celery에는 자체 로깅 처리기가 있습니다.

from celery.utils.log import get_task_logger
logger = get_task_logger(__name__)

또한 Celery는 작업의 모든 출력을 기록합니다. 작업 로깅을위한 Celery 문서에 대한 자세한 내용

참고 URL : https://stackoverflow.com/questions/6192265/send-log-messages-from-all-celery-tasks-to-a-single-file

반응형