Python / Django: inicie sesión en la consola en runserver, inicie sesión en un archivo en Apache

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

Revisé Registro de Django y aunque me impresionó su flexibilidad y capacidad de configuración para usos avanzados, todavía estoy perplejo sobre cómo manejar mi caso de uso simple.

preguntado el 29 de diciembre de 10 a las 20:12

La solución más simple es tener diferentes archivos settings.py para el servidor principal y el entorno de desarrollo, consulte deploymentdjango.com/django_project_structure -

6 Respuestas

El texto impreso en stderr aparecerá en el registro de errores de httpd cuando se ejecute bajo mod_wsgi. Puedes usar print directamente, o usar logging preferiblemente.

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

Respondido el 29 de diciembre de 10 a las 23:12

Sin embargo, técnicamente no es WSGI válido y provocará errores en entornos más estrictos. - Pablo McMillan

No hay nada de malo en usar 'print' con 'sys.stderr' en lo que respecta a WSGI y no debería generar errores. - graham dumpleton

Importé sys pero esto no parece funcionar para mí. - Hack-R

Esto no funciona en Python 3 echa un vistazo aquí. Necesitas print("Goodbye cruel world!", file=sys.stderr) - cardamomo

Aquí hay una solución basada en registros 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']

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

Respondido 09 Feb 17, 18:02

intenta también LOGGING['loggers'][logger]['handlers'] += ['console'] - Nir Levy

@ m01: Después de configurar esto en settings.py, ¿cómo usarlo para imprimir? Gracias - niks jain

Puse el código de mi respuesta en mi settings.py hacia la parte inferior, y poner DEBUG = True (busque esa configuración cerca de la parte superior en el mismo archivo). Entonces, corro python manage.py runserver desde una terminal (consulte los documentos de django para obtener más detalles), y los mensajes de registro aparecerán en la ventana de la terminal. En producción, usaría un settings.py diferente, donde DEBUG = False - los mensajes de registro van a /path/to/your/file.log. - m01

Tu sangría me dio dolor de cabeza. Sin embargo, gracias por la información, ¡funciona! - Juan

¡Gracias! Hice algunos cambios en la sangría, espero que esté mejor ahora. m01

Puede configurar el inicio de sesión en su settings.py archivo.

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 quieras tener que 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 Django 1.1, la configuración de registro en Django ha cambiado algo desde esa versión.

contestado el 23 de mayo de 17 a las 12:05

No quiero depender de DEBUG; Prefiero depender del mecanismo de detección del servidor de desarrollo vinculado en esa otra publicación. Pero el mecanismo de detección de la otra publicación se basa en tener acceso a una instancia de solicitud. ¿Cómo puedo obtener una instancia de solicitud en settings.py? - beca justin

Yo uso esto:

registro.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,)

aplicación de prueba.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()

Respondido el 14 de junio de 13 a las 04:06

Puedes hacer esto con bastante facilidad con tagalog (https://github.com/dorkitude/tagalog)

Por ejemplo, mientras que 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 usa logging.INFO.

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

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

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

Respondido el 13 de enero de 11 a las 09:01

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',
}

Respondido el 10 de junio de 15 a las 11:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.