python - send_task - Enviar mensajes de registro de todas las tareas de apio a un solo archivo
python celery crontab (2)
Solo una pista: Aplery tiene su propio controlador de registro:
from celery.utils.log import get_task_logger
logger = get_task_logger(__name__)
Además, Apio registra todos los resultados de la tarea. Más detalles en los documentos de Aplery para Tarea de registro
Me pregunto cómo configurar un sistema de registro más específico. Todas mis tareas usan
logger = logging.getLogger(__name__)
como un registrador de todo el módulo.
Quiero que el apio se registre en "apical.log" y mis tareas en "tasks.log", pero no tengo idea de cómo hacerlo funcionar. Utilizando CELERYD_LOG_FILE
desde django- CELERYD_LOG_FILE
puedo enrutar todos los mensajes de registro relacionados con apical a aplery.log pero no hay rastro de los mensajes de registro creados en mis tareas.
Nota: Esta respuesta está desactualizada a partir de Celery 3.0, donde ahora usa get_task_logger()
para configurar su registrador por tarea. Consulte la sección de registro del documento Novedades en Celery 3.0 para obtener más información.
Apio tiene soporte dedicado para el registro, por tarea. Consulte la documentación de la tarea sobre el tema :
Puede usar el registrador de trabajadores para agregar resultados de diagnóstico al registro de trabajador:
@celery.task() def add(x, y): logger = add.get_logger() logger.info("Adding %s + %s" % (x, y)) return x + y
Hay varios niveles de registro disponibles, y la configuración del nivel de registro de los trabajadores decide si se escribirán o no en el archivo de registro.
Por supuesto, también puede usar simplemente imprimir ya que todo lo escrito en la salida estándar / -err también se escribirá en el archivo de registro.
Debajo del capó, este sigue siendo el módulo de registro de python estándar. Puede configurar la opción CELERYD_HIJACK_ROOT_LOGGER
en False para permitir que su propia configuración de registro funcione, de lo contrario, Aplery configurará el manejo por usted.
Sin embargo, para las tareas, la llamada .get_logger()
le permite configurar un archivo de registro separado para cada tarea individual. Simplemente pase un argumento de logfile
y enviará los mensajes de registro a ese archivo separado:
@celery.task()
def add(x, y):
logger = add.get_logger(logfile=''tasks.log'')
logger.info("Adding %s + %s" % (x, y))
return x + y
Por último, puede configurar su paquete de nivel superior en el módulo de registro de Python y otorgarle un controlador de archivos propio. Lo configuré usando la señal celery.signals.after_setup_task_logger
; aquí supongo que todos sus módulos viven en un paquete llamado foo.tasks
(como en foo.tasks.email
y 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)
Ahora cualquier registrador cuyo nombre comience con foo.tasks
tendrá todos sus mensajes enviados a tasks.log
lugar de al registrador de raíz (que no ve ninguno de estos mensajes porque .propagate
es False).