Django logueando en Heroku

Sé que esta pregunta ya se hizo varias veces, pero simplemente no puedo hacer que funcione. Ya pasé medio día probando docenas de combinaciones, y ahora otra vez y todavía no funciona.

En mi código, estoy registrando en varias partes, como en un bash de excepción, o para registrar algunas informaciones de los comandos de administración. Estoy haciendo cosas muy normales, que están funcionando en varias instalaciones locales y en algunos servidores Nginx.

Un archivo de python como este:

import logging logger = logging.getLogger(__name__) logger.info('some important infos') 

Con seguir como settings.py mínimo (probé sin indicación de flujo, sin los registradores especificados, con registradores con nombre, casi todas las combinaciones posibles y también probé otras mucho más complejas)

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

Entonces también simplemente probado desde el shell heroku run python

 import logging level = logging.INFO handler = logging.StreamHandler() handler.setLevel(level) handler.setFormatter(logging.Formatter('%(levelname)s: %(message)s')) logger = logging.getLogger('info') logger.addHandler(handler) logger.setLevel(level) #even if not required... logger.info('logging test') 

El último puede aparecer como una statement de “impresión” en la consola, pero ni aquí ni desde el comando ni el servidor, nunca aparece nada en los heroku logs

EDIT: en realidad tengo algunas entradas que se muestran, registros de aplicaciones como los siguientes, pero no los míos:

 2013-09-20T15:00:16.405492+00:00 heroku[run.2036]: Process exited with status 0 2013-09-20T15:00:17+00:00 app[heroku-postgres]: source=HEROKU_POSTGRESQL_OLIVE sample[...] 2013-09-20T14:59:47.403049+00:00 heroku[router]: at=info method=GET path=/ 2013-09-20T14:59:16.304397+00:00 heroku[web.1]: source=web.1 dyno=heroku [...] 

También traté de buscar entradas usando varios complementos. Tuve un momento al comienzo de newrelic, que luego también desactivé desde el inicio de WSGI. No recuerdo si en ese momento funcionó bien, el período de prueba gratuita de newrelic es bastante corto.

Bueno, no sé qué podría intentar de otra manera … Gracias por cualquier pista

Iniciar sesión en Heroku desde Django puede ser complicado al principio, pero en realidad no es tan horrible prepararse.

La siguiente definición de registro (entra en su archivo de configuración) definió dos formateadores. El detallado coincide con el formato de registro que utiliza Heroku. También define dos manejadores, un manejador nulo (no debería ser usado) y un manejador de consola: el manejador de consola es lo que quiere usar con Heroku. La razón de esto es que el registro en Heroku funciona mediante un simple registrador de secuencias, que registra cualquier salida realizada en stdout / stderr. Por último, he definido un registrador llamado testlogger: esta parte de la definición de registro es normal para las definiciones de registro.

 LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'verbose': { 'format': ('%(asctime)s [%(process)d] [%(levelname)s] ' + 'pathname=%(pathname)s lineno=%(lineno)s ' + 'funcname=%(funcName)s %(message)s'), 'datefmt': '%Y-%m-%d %H:%M:%S' }, 'simple': { 'format': '%(levelname)s %(message)s' } }, 'handlers': { 'null': { 'level': 'DEBUG', 'class': 'logging.NullHandler', }, 'console': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', 'formatter': 'verbose' } }, 'loggers': { 'testlogger': { 'handlers': ['console'], 'level': 'INFO', } } } 

A continuación, cómo usar esto. En este caso simple, puede hacer lo siguiente en cualquier otro archivo en su proyecto de Django, para escribir en este registrador específico que definimos ( testlogger ). Recuerde que según la definición del registrador en nuestro archivo de configuración, se emitirá cualquier mensaje de registro INFO o superior.

 import logging logger = logging.getLogger('testlogger') logger.info('This is a simple log message') 

Necesita ‘activar’ sus registradores manualmente. Puedes hacer esto por módulo, como ‘blog.views’. Recogerá submódulos, así que para registrar toda la aplicación del blog, simplemente colóquela en ‘blog’.

Si lo deja vacío, registrará todo lo que no se haya manejado antes y con propagate = True (no es el valor predeterminado). Esto también registrará todo Django, lo que significa que en el nivel de depuración obtendrá consultas SQL en sus registros.

 'loggers': { 'django.request': { 'handlers': ['mail_admins'], 'level': 'ERROR', 'propagate': False, }, 'blog.views': { 'handlers': ['console'], }, 'blog': { 'handlers': ['console'], }, '': { 'handlers': ['console'], 'level': 'DEBUG', # Not recommended. } } 

En mi caso, tuve una configuración de registro válida

 LOGGING = {...} 

Desafortunadamente, se estaba ignorando porque, al final de mi archivo de configuración, estaba llamando

 django_heroku.settings(locals()) 

Esto fue sobrescribir mi configuración de registro, por lo que la solución fue

 django_heroku.settings(locals(), logging=False) 

Parece que podría deshabilitar el registro, pero en realidad solo omite la configuración de registro propia de heroku.


Como nota al margen, usaría este código al depurar problemas de registro de Django porque debería funcionar más o menos siempre con los valores predeterminados de Django:

 import logging logger = logging.getLogger('django.server') logger.error('some important infos') 

Ver la configuración de registro por defecto de Django.

Luego puede cambiar el registrador, el nivel de mensaje y la configuración de registro para resolver exactamente cuál es el problema.