Python / Django: inicie sesión en la consola en runserver, inicie sesión en un archivo en Apache
Frecuentes
Visto 141,181 equipos
118
¿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.
6 Respuestas
86
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
105
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
27
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
4
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
0
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
0
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 python django logging or haz tu propia pregunta.
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 - Alex