python - logrecord - loggers django




Python/Django: inicie sesión en console en runserver, log to file bajo Apache (4)

¿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!'

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.





logging