Python / Django: registro en la consola en el servidor de ejecución, registro en el archivo en Apache

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

Revisé el registro de Django y, aunque me impresionó su flexibilidad y capacidad de configuración para usos avanzados, aún me sorprende cómo manejar mi caso de uso simple.

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

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

Aquí hay una solución basada en el registro de Django. Utiliza la configuración DEBUG en lugar de verificar si está ejecutando el servidor de desarrollo o no, pero si encuentra una mejor manera 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'] 

consulte https://docs.djangoproject.com/en/dev/topics/logging/ para obtener más información.

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 DEBUG, y tal vez no quiera tener que preocuparse por cómo se configura. 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 manera de escribir ese condicional. Edición: el ejemplo anterior es de un proyecto Django 1.1, la configuración de registro en Django ha cambiado algo desde esa versión.

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() 

Puede hacer esto fácilmente con tagalog (https://github.com/dorkitude/tagalog)

Por ejemplo, mientras el módulo estándar de Python 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, uno podría simplemente hacer:

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

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

Esto funciona bastante bien en mi local.py, me ahorra un error en 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', }