standard run locally google engine deploy app python django google-app-engine logging django-nonrel

run - Python- ¿Cómo vaciar el registro?(django)



run django app locally (4)

Estoy trabajando con Django-nonrel en Google App Engine, lo que me obliga a usar logging.debug () en lugar de print ().

Django proporciona el módulo de "registro", pero me está costando usarlo en lugar de imprimir ().

Por ejemplo, si necesito verificar el contenido contenido en la variable x, pondré
logging.debug(''x is: %s'' % x) . Pero si el programa falla poco después (sin vaciar el flujo), nunca se imprime.

Así que para la depuración, necesito que se vacíe debug () antes de que el programa salga por error, y esto no está sucediendo.


Creo que esto puede funcionar para usted, asumiendo que solo está usando un controlador (o predeterminado):

>>> import logging >>> logger = logging.getLogger() >>> logging.debug(''wat wat'') >>> logger.handlers[0].flush()

Sin embargo, está algo mal visto en la documentación.

El código de la aplicación no debe crear instancias y usar instancias de Handler directamente. En su lugar, la clase Handler es una clase base que define la interfaz que todos los handlers deberían tener y establece algún comportamiento predeterminado que las clases secundarias pueden usar (o anular). http://docs.python.org/2/howto/logging.html#handler-basic

Y podría ser una pérdida de rendimiento, pero si está realmente atascado, esto puede ayudar con su depuración.


El registro de Django se basa en el módulo de registro de Python estándar.

Este módulo tiene un método a nivel de módulo: logging.shutdown() que limpia todos los controladores y apaga el sistema de registro (es decir, el registro ya no se puede usar después de que se llame)

La inspección del código de esta función muestra que actualmente (python 2.7) el módulo de registro contiene una lista de referencias débiles a todos los controladores en una variable de nivel de módulo llamada _handlerList, de modo que todos los controladores se pueden vaciar haciendo algo como

[h_weak_ref().flush() for h_weak_ref in logging._handlerList]

Debido a que esta solución utiliza los elementos internos del módulo @Mikes, la solución anterior es mejor, pero se basa en tener acceso a un registrador, se puede generalizar de la siguiente manera:

[h.flush() for h in my_logger.handlerList]


Luché con un problema similar y aquí es cómo lo resolví. En lugar de utilizar el módulo de logging directamente para generar sus registros, inicie su propio registrador de la siguiente manera:

import sys import logging def init_logger(): logger = logging.getLogger() h = logging.StreamHandler(sys.stdout) h.flush = sys.stdout.flush logger.addHandler(h) return logger

Luego, úselo en lugar de logging en su código:

def f(): logger = init_logger() logger.debug(''...'')

Como resultado, ya no tendrá problemas con el vaciado de registros.


Si el caso de uso es que tiene un programa de Python que debería vaciar sus registros al salir, use logging.shutdown() .

De la documentación de python:

logging.shutdown ()

Informa al sistema de registro para que realice un cierre ordenado vaciando y cerrando todos los manejadores. Esto debe llamarse al salir de la aplicación y no debe hacerse ningún uso adicional del sistema de registro después de esta llamada.