logrecord loggers logger log everything errors english docs debug python django logging

loggers - Python/Django: inicie sesión en console en runserver, log to file bajo Apache



logger debug django (6)

¿Cómo puedo enviar mensajes de seguimiento a la consola (como print ) cuando estoy ejecutando mi aplicación Django en manage.py runserver , pero los envío a un archivo de registro cuando manage.py runserver la aplicación bajo Apache?

Revisé el registro de Django y, aunque estaba impresionado con su flexibilidad y capacidad de configuración para usos avanzados, todavía no sé cómo manejar mi sencillo caso de uso.


Aquí hay una solución basada en el registro de Django. Utiliza la configuración de DEPURACIÓN en lugar de comprobar realmente si está ejecutando o no el servidor de desarrollo, pero si encuentra una forma mejor de verificarlo, debería ser fácil de adaptar.

LOGGING = { ''version'': 1, ''formatters'': { ''verbose'': { ''format'': ''%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'' }, ''simple'': { ''format'': ''%(levelname)s %(message)s'' }, }, ''handlers'': { ''console'': { ''level'': ''DEBUG'', ''class'': ''logging.StreamHandler'', ''formatter'': ''simple'' }, ''file'': { ''level'': ''DEBUG'', ''class'': ''logging.FileHandler'', ''filename'': ''/path/to/your/file.log'', ''formatter'': ''simple'' }, }, ''loggers'': { ''django'': { ''handlers'': [''file''], ''level'': ''DEBUG'', ''propagate'': True, }, } } if DEBUG: # make all loggers use the console. for logger in LOGGING[''loggers'']: LOGGING[''loggers''][logger][''handlers''] = [''console'']

ver https://docs.djangoproject.com/en/dev/topics/logging/ para más detalles.


El texto impreso en stderr se mostrará en el registro de errores de httpd cuando se ejecute en mod_wsgi. Puede usar print directamente o usar el logging lugar.

print >>sys.stderr, ''Goodbye, cruel world!''


Esto funciona bastante bien en mi local.py, me ahorra estropear el registro regular:

from .settings import * LOGGING[''handlers''][''console''] = { ''level'': ''DEBUG'', ''class'': ''logging.StreamHandler'', ''formatter'': ''verbose'' } LOGGING[''loggers''][''foo.bar''] = { ''handlers'': [''console''], ''propagate'': False, ''level'': ''DEBUG'', }


Puede configurar el registro en su archivo settings.py .

Un ejemplo:

if DEBUG: # will output to your console logging.basicConfig( level = logging.DEBUG, format = ''%(asctime)s %(levelname)s %(message)s'', ) else: # will output to logging file logging.basicConfig( level = logging.DEBUG, format = ''%(asctime)s %(levelname)s %(message)s'', filename = ''/my_log_file.log'', filemode = ''a'' )

Sin embargo, eso depende de la configuración de DEPURACIÓN, y tal vez no quieras preocuparte por cómo está configurado. Vea esta respuesta en ¿Cómo puedo saber si mi aplicación Django se está ejecutando en el servidor de desarrollo o no? para una mejor forma de escribir ese condicional. Editar: el ejemplo anterior es de un proyecto de Django 1.1, la configuración de registro en Django ha cambiado un poco desde esa versión.


Puedes hacerlo fácilmente con tagalog (https://github.com/dorkitude/tagalog)

Por ejemplo, mientras el módulo de python estándar escribe en un objeto de archivo abierto en modo de adición, el módulo de App Engine (https://github.com/dorkitude/tagalog/blob/master/tagalog_appengine.py) anula este comportamiento y en su lugar utiliza el logging.INFO .

Para obtener este comportamiento en un proyecto de App Engine, simplemente podría hacer:

import tagalog.tagalog_appengine as tagalog tagalog.log(''whatever message'', [''whatever'',''tags''])

Puede extender el módulo usted mismo y sobrescribir la función de registro sin mucha dificultad.


Yo uso esto:

logging.conf:

[loggers] keys=root,applog [handlers] keys=rotateFileHandler,rotateConsoleHandler [formatters] keys=applog_format,console_format [formatter_applog_format] format=%(asctime)s-[%(levelname)-8s]:%(message)s [formatter_console_format] format=%(asctime)s-%(filename)s%(lineno)d[%(levelname)s]:%(message)s [logger_root] level=DEBUG handlers=rotateFileHandler,rotateConsoleHandler [logger_applog] level=DEBUG handlers=rotateFileHandler qualname=simple_example [handler_rotateFileHandler] class=handlers.RotatingFileHandler level=DEBUG formatter=applog_format args=(''applog.log'', ''a'', 10000, 9) [handler_rotateConsoleHandler] class=StreamHandler level=DEBUG formatter=console_format args=(sys.stdout,)

testapp.py:

import logging import logging.config def main(): logging.config.fileConfig(''logging.conf'') logger = logging.getLogger(''applog'') logger.debug(''debug message'') logger.info(''info message'') logger.warn(''warn message'') logger.error(''error message'') logger.critical(''critical message'') #logging.shutdown() if __name__ == ''__main__'': main()