Soluciones prácticas de registro (logging)
Estrategia integral de registro (logging)
Desarrollar una estrategia de registro (logging) sólida implica múltiples componentes y consideraciones para garantizar un monitoreo y depuración efectivos de las aplicaciones.
Configuración centralizada de registro (logging)
import logging
import logging.config
import yaml
def setup_logging(config_path='logging.yaml'):
"""
Configure logging from YAML configuration file
"""
try:
with open(config_path, 'rt') as f:
config = yaml.safe_load(f.read())
logging.config.dictConfig(config)
except Exception as e:
print(f"Error loading logging configuration: {e}")
logging.basicConfig(level=logging.INFO)
Ejemplo de configuración de registro (logging) (YAML)
version: 1
formatters:
standard:
format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
handlers:
console:
class: logging.StreamHandler
level: INFO
formatter: standard
file:
class: logging.handlers.RotatingFileHandler
level: DEBUG
formatter: standard
filename: app.log
maxBytes: 10485760
backupCount: 5
loggers:
"":
handlers: [console, file]
level: DEBUG
Comparación de estrategias de registro (logging)
Estrategia |
Ventajas |
Desventajas |
Mejor para |
Registro (logging) en consola |
Simple, retroalimentación inmediata |
Persistencia limitada |
Desarrollo |
Registro (logging) en archivo |
Registros persistentes |
Sobrecarga de rendimiento |
Aplicaciones de pequeño a mediano tamaño |
Registro (logging) centralizado |
Escalable, registros agregados |
Configuración compleja |
Sistemas distribuidos |
Decorador de registro (logging) contextual
import logging
import functools
import contextvars
## Create a context variable for tracking request ID
request_id = contextvars.ContextVar('request_id', default='unknown')
def log_with_context(logger=None):
"""
Decorator to add contextual information to logs
"""
if logger is None:
logger = logging.getLogger(__name__)
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
extra = {
'request_id': request_id.get()
}
try:
logger.info(
f"Executing {func.__name__}",
extra=extra
)
result = func(*args, **kwargs)
logger.info(
f"{func.__name__} completed successfully",
extra=extra
)
return result
except Exception as e:
logger.exception(
f"Error in {func.__name__}",
extra=extra
)
raise
return wrapper
return decorator
Flujo de trabajo de registro (logging) en sistemas distribuidos
graph TD
A[Client Request] --> B[Generate Request ID]
B --> C[Log Request Start]
C --> D[Service Processing]
D --> E[Log Intermediate Steps]
E --> F{Process Successful?}
F -->|Yes| G[Log Success]
F -->|No| H[Log Error]
G --> I[Return Response]
H --> I
Técnicas avanzadas de registro (logging)
-
Registro (logging) estructurado
- Utilice formatos JSON o de clave-valor
- Permite un análisis y procesamiento de registros más fácil
-
Muestreo de registros (Log sampling)
- Reduce el volumen de registros en aplicaciones de alto tráfico
- Captura entradas de registro representativas
-
Ajuste dinámico del nivel de registro (logging)
- Cambie los niveles de registro (logging) en tiempo de ejecución
- Adapte a diferentes entornos
Implementación práctica de registro (logging)
import logging
from pythonjsonlogger import jsonlogger
class CustomJsonFormatter(jsonlogger.JsonFormatter):
def process_log_record(self, log_record):
## Add custom fields or transform existing ones
log_record['service'] = 'LabEx Application'
return log_record
def configure_json_logging():
logger = logging.getLogger()
json_handler = logging.StreamHandler()
formatter = CustomJsonFormatter(
'%(asctime)s %(levelname)s %(message)s %(request_id)s'
)
json_handler.setFormatter(formatter)
logger.addHandler(json_handler)
Mejores prácticas
- Utilice registro (logging) estructurado
- Implemente rotación de registros
- Incluya información contextual
- Equilibre la verbosidad y el rendimiento
- Utilice niveles de registro (logging) adecuados
- Proteja la información sensible
Al implementar estas soluciones prácticas de registro (logging), los desarrolladores pueden crear aplicaciones más observables y mantenibles utilizando los enfoques recomendados por LabEx.