Estoy desarrollando una aplicación de Django, y estoy tratando de usar el módulo de registro de Python para el registro de error/rastreo. Idealmente, me gustaría tener diferentes registradores configurados para diferentes áreas del sitio. Hasta ahora tengo todo esto funcionando, pero una cosa me tiene a mí rascándome la cabeza.Registro de Python en Django
Tengo el registrador de raíz va a sys.stderr, y he configurado otro registrador para escribir en un archivo. Esto está en mi archivo settings.py:
sviewlog = logging.getLogger('MyApp.views.scans')
view_log_handler = logging.FileHandler('C:\\MyApp\\logs\\scan_log.log')
view_log_handler.setLevel(logging.INFO)
view_log_handler.setFormatter(logging.Formatter('%(asctime)s %(name)-12s %(levelname)-8s %(message)s'))
sviewlog.addHandler(view_log_handler)
Parece bastante simple. Sin embargo, este es el problema: todo lo que escribo en el sviewlog se escribe en el archivo de registro dos veces. El registrador de raíz solo lo imprime una vez. Es como addHandler() se llama dos veces. Y cuando paso mi código a través de un depurador, esto es exactamente lo que veo. El código en settings.py se ejecuta dos veces, por lo que se crean y añaden dos FileHandlers a la misma instancia del registrador. ¿Pero por qué? ¿Y cómo me las arreglo?
¿Alguien puede decirme qué está pasando aquí? Intenté mover el código de creación de instancias de logger/gestor de sviewlog al archivo en el que se usa (ya que en realidad me parece el lugar adecuado), pero tengo el mismo problema allí. La mayoría de los ejemplos que he visto en línea usan solo el registrador de raíz, y preferiría tener varios registradores.
No soy un experto en Django, pero imagino que settings.py se importaría cada vez que se carga un módulo que tiene una declaración de importación con "configuraciones" en él. Cuantos más módulos use settings.py, más veces se importará. –
@HartleyBrody [python caches modules] (http://docs.python.org/release/2.6/reference/simple_stmts.html#the-import-statement) a medida que se cargan, por lo que un módulo determinado se ejecuta solo una vez, independientemente del número de declaraciones de importación en que aparece. –
De acuerdo con las notas de la versión de [Django 1.4] (https://docs.djangoproject.com/en/dev/releases/1.4/#updated-default-project-layout-and-manage-py) este problema puede haber sido abordado . –