2012-03-09 19 views
10

Tengo una aplicación llamada main en mi proyecto Django. Esta aplicación tiene un varios comandos de gestión que desea iniciar sesión, pero nada está apareciendo en la salida estándar con la siguiente configuración:Registro Django de comandos de administración personalizados

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'handlers': { 
     'log_to_stdout': { 
      'level': 'DEBUG', 
      'class': 'logging.StreamHandler', 
      'stream': sys.stdout, 
      }, 
     }, 
    'loggers': { 
     'main': { 
      'handlers': ['log_to_stdout'], 
      'level': 'DEBUG', 
      'propagate': True, 
      } 
     } 
    } 

¿Qué estoy haciendo mal? He intentado usar my_project.main también, pero eso tampoco funcionó. Estoy usando 1.3.0 final.

+0

el comando que se está utilizando para registrar la salida? – second

+0

He intentado 'logging.info' y' logging.debug', pero ninguno de ellos funciona. Después de escribir esta pregunta, noté que 'logging.warn' * does * me da una impresión en stdout. – damd

Respuesta

12

necesita espacio de nombre de su registrador. Actualmente se está conectando al registrador de la raíz, que no está atrapado por su controlador, que está buscando main

en lugar de logging.debug("message"), desea

logger = logging.getLogger('main') 
logger.debug("message") 
1

No es necesario configurar "stream" en sys.stdout. Sin embargo, se debe definir un formateador:

Ejemplo:

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'formatters': { 
     'simple': { 
      'format': '%(levelname)s %(message)s' 
     }, 
    }, 
    'handlers': { 
     'log_to_stdout': { 
      'level': 'DEBUG', 
      'class': 'logging.StreamHandler', 
      'formatter': 'simple', 
      }, 
     }, 
    'loggers': { 
     'main': { 
      'handlers': ['log_to_stdout'], 
      'level': 'DEBUG', 
      'propagate': True, 
     } 
    } 
} 
+0

Lo intenté copiando y pegando su código de ejemplo al pie de la letra, pero aun así, no obtuve nada de stdout. * Sin embargo *, cuando inserto 'logging.warn ('foo')' como primer enunciado, obtengo una impresión en stdout. 'logging.info' y' logging.debug' todavía no funcionan. – damd

-2

Si se está inscribiendo estos comandos personalizados con cron, puede "forzar" el registro con sólo redirigir la salida a un archivo de texto.

* 12 * * * python /path/to/my/custom/command.py >> /path/to/my/logfile.txt 

Esto ejecutará una tarea programada a las 12 am cada mañana, y nada dirigido a la salida estándar (como declaraciones de impresión pitón) se vierten en este archivo de texto, concatenado en cualquier texto existente en el archivo de registro.

Si no está usando cron, solo cree un único script de shell que ejecute todos los scripts que necesita ejecutar y guíelos manualmente a los archivos de registro que desee.

python /path/to/my/custom/command.py >> /path/to/my/logfile.txt 

... y así sucesivamente.

+0

Gracias, pero este es el método que utilicé antes. Intento hacer lo correcto y usar las capacidades de registro "integradas" de Django si es posible. – damd

+0

Bastante justo. Con suerte, alguien intervendrá y lo ayudará con esto; Soy primitivo y uso la redirección de shell. :) – patrickn

Cuestiones relacionadas