loggers - Python/Django: inicie sesión en console en runserver, log to file bajo Apache
logger debug django (6)
¿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!''
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'',
}
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.
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()