Rich
22 Junio, 2022 20:23
1
Hola!
Contexto
Me encuentro con la necesidad de deprecar una funcionalidad en pos de otra nueva.
Usando algunas librerías de Python suelo ver el uso de DeprecationWarning
y me parece que cumple con lo que necesito.
Lo estoy utilizando de esta manera pero el problema es que en el output de la terminal no lo veo.
import warnings
warnings.warn("Deprecado", DeprecationWarning)
Puede tener que ver con la configuración de Logging de Django?
Gracias!
Edit
De la documentación
Ignored by the default warning filters, except in the __main__
module (PEP 565 ). Enabling the Python Development Mode shows this warning.
Probé con FutureWarning y sale bien pero creo que la que quiero es Deprecation
manuq
22 Junio, 2022 21:34
2
Hola @Rich ,
al parecer warnings.warn()
tira la advertencia al sys.stderr
. Tendrías que ver a qué está conectado el stderr en Django. ¿Algún archivo de log de wsgi por ej? ¿Qué pasa si hacés print("¡ojo!", file=sys.stderr)
? Debería ser lo mismo.
Si realmente querés la advertencia en el logging, creo que deberías conectarlo así:
https://docs.python.org/3/library/logging.html#logging.captureWarnings
Rich
23 Junio, 2022 12:05
3
Me imagino que la config de Logging tiene algo que ver.
Me gusta eso de captureWarnings
. Pruebo y comento que sale.
Gracias manuq!
manuq
24 Junio, 2022 21:22
4
Rich
12 Julio, 2022 21:45
5
Hola manuq.
Colgué un poco pero finalmente pude probar algunas cosas.
Probé con la configuración igual a la de SO
Me crea el archivo de logs pero queda vacío
Agregué un nuevo logger como está configurado en esa respuesta de SO, cambiando el handler a console
.
No muestra nada en la consola
import logging
logging.captureWarnings(True)
logger = logging.getLogger(__name__)
warnings.warn("No usar este método", DeprecationWarning)
Con la misma config, agregué una línea que captura el warning y lo “transforma” en error.
No me termina de servir porque frena la ejecución del programa
import logging
logging.captureWarnings(True)
logger = logging.getLogger(__name__)
warnings.simplefilter("error", DeprecationWarning)
warnings.warn("No usar este método", DeprecationWarning)
Con esto último entiendo que el Warning está siendo captado. Me falta saber adónde está yendo a parar ese bendito log
Logging configuration
LOGGING = {
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"verbose": {
"format": "{levelname} {asctime} {module} {filename} {funcName}.{lineno}: {message}",
"style": "{",
},
},
"handlers": {
"console": {
"class": "logging.StreamHandler",
"formatter": "verbose",
# Por defecto el level es INFO, lo que hace que se descarten
# los mensajes DEBUG si los queremos activar en producción
"level": "DEBUG"
},
},
"loggers": {
"root": {
"handlers": ["console"],
"level": os.getenv("DJANGO_LOG_LEVEL", "INFO"),
},
'py.warnings': {
'handlers': ['console'],
'level': 'WARNING',
'propagate': True
}
}
}
1 me gusta