0Pricing
Production Debugging & Incident Response Playbook · Lección

Buenas prácticas de registro estructurado

Implemente un registro estructurado para facilitar el análisis y el procesamiento, y acelerar la depuración de problemas en producción.

Buenas prácticas de registro estructurado es una lección gratuita de Production Debugging & Incident Response Playbook en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Production Debugging & Incident Response Playbook, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Production Debugging & Incident Response Playbook incluye 4 lecciones en total.

Partes de esta lección aún no han sido traducidas y se muestran en inglés.

What are Logs?

Logs are records of events that happen in your application or system. Think of them as a diary for your software!

They're crucial for understanding what your program is doing, especially when things go wrong in a live "production" environment.

The Messy Truth

Often, logs are just plain text strings. This is called unstructured logging. While easy to write, unstructured logs are hard for computers to read and analyze, making debugging a slow, manual process.

Consider this example:

import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

def process_order(order_id, item_count):
    logger.info(f"Processing order {order_id} with {item_count} items.")
    if item_count > 10:
        logger.warning(f"Large order detected for {order_id}. Items: {item_count}.")
    logger.info(f"Order {order_id} processed successfully.")

if __name__ == "__main__":
    process_order("ORD-123", 5)
    process_order("ORD-456", 12)

What is Structured Logging?

Structured logging means your logs are formatted as machine-readable data, not just free-form text. The most common format is JSON.

Instead of a single string, each log entry is an object with key-value pairs. This makes them easy to search, filter, and analyze programmatically.

Why Structured Logging Rocks

Structured logs offer many advantages:

  • Faster Debugging: Quickly find relevant events.
  • Better Analysis: Easily query and aggregate data.
  • Automated Tools: Integrate with monitoring and alerting systems.
  • Consistency: Ensures all logs contain expected fields.

JSON is King

While other formats exist, JSON (JavaScript Object Notation) is the most popular choice for structured logging due to its simplicity and widespread support.

A JSON log entry is a self-contained object, making it incredibly versatile for storing varied data. Here's what a structured log might look like:

{
  "timestamp": "2023-10-27T10:30:00Z",
  "level": "INFO",
  "service": "order-processor",
  "message": "Order processed successfully",
  "order_id": "ORD-123",
  "item_count": 5
}

Code It Up!

Let's see how to implement structured logging. Many languages have libraries that make this easy. Here's a basic Python example using the standard logging module with a custom JSON formatter.

import logging
import json

class JsonFormatter(logging.Formatter):
    def format(self, record):
        log_entry = {
            "timestamp": self.formatTime(record, self.datefmt),
            "level": record.levelname,
            "name": record.name,
            "message": record.getMessage(),
            "file": record.filename,
            "line": record.lineno
        }
        if hasattr(record, 'order_id'):
            log_entry['order_id'] = record.order_id
        if hasattr(record, 'item_count'):
            log_entry['item_count'] = record.item_count
        return json.dumps(log_entry)

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

handler = logging.StreamHandler()
handler.setFormatter(JsonFormatter())
logger.addHandler(handler)

def process_order(order_id, item_count):
    extra_data = {'order_id': order_id, 'item_count': item_count}
    logger.info("Processing order", extra=extra_data)
    if item_count > 10:
        logger.warning("Large order detected", extra=extra_data)
    logger.info("Order processed successfully", extra=extra_data)

if __name__ == "__main__":
    process_order("ORD-123", 5)
    process_order("ORD-456", 12)

Must-Have Fields

Every structured log entry should include these core fields for effective analysis:

  • timestamp: When the event happened (ISO 8601 format).
  • level: Severity (INFO, WARN, ERROR, DEBUG).
  • service: Which service or application generated the log.
  • message: A human-readable summary of the event.
  • hostname/pod_name: Where the log originated.

Enrich Your Logs

Beyond essential fields, add contextual data specific to the event. This is key for tracing requests across distributed systems, helping you connect the dots when debugging complex issues.

  • request_id: To track a single user request.
  • user_id: To identify the user involved.
  • transaction_id: For specific business transactions.
import logging
import json
import uuid

# Reusing the JsonFormatter from previous scene
class JsonFormatter(logging.Formatter):
    def format(self, record):
        log_entry = {
            "timestamp": self.formatTime(record, self.datefmt),
            "level": record.levelname,
            "message": record.getMessage()
        }
        for key, value in record.__dict__.items():
            if not key.startswith('_') and key not in ['name', 'levelname', 'pathname', 'filename', 'module', 'exc_info', 'exc_text', 'stack_info', 'lineno', 'funcName', 'created', 'msecs', 'relativeCreated', 'thread', 'threadName', 'processName', 'process', 'args', 'msg', 'asctime']:
                log_entry[key] = value
        return json.dumps(log_entry)

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
handler = logging.StreamHandler()
handler.setFormatter(JsonFormatter())
logger.addHandler(handler)

def handle_web_request(user_id):
    request_id = str(uuid.uuid4())[:8]
    extra_data = {'request_id': request_id, 'user_id': user_id, 'service': 'api-gateway'}
    logger.info("Received web request", extra=extra_data)
    
    if user_id == "user-vip":
        logger.info("VIP user request detected", extra=extra_data)
    else:
        logger.debug("Standard user request", extra=extra_data)
    
    logger.info("Request processed", extra=extra_data)

if __name__ == "__main__":
    handle_web_request("user-123")
    handle_web_request("user-vip")

Log Levels

Log levels help categorize the severity and importance of a log message. Common levels include:

  • DEBUG: Detailed info, only useful when diagnosing problems.
  • INFO: Confirmation that things are working as expected.
  • WARN: An unexpected event, but the application is still running.
  • ERROR: An error that prevents some functionality from working.
  • CRITICAL: A severe error, application might be unable to continue.

Quick Check

Structured logging is a powerful technique for improving observability. Let's test your understanding of its key advantages.

Structured Logging Recap

You've learned about the power of structured logging! By formatting your logs as machine-readable data (like JSON), you unlock faster debugging, better analysis, and seamless integration with monitoring tools.

Remember to include essential fields and contextual data to make your logs truly useful for diagnosing issues in production.

Preguntas frecuentes

¿La lección «Buenas prácticas de registro estructurado» es gratis?

Sí — el texto completo de «Buenas prácticas de registro estructurado» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Production Debugging & Incident Response Playbook, actualiza a CoddyKit PRO. El curso de Production Debugging & Incident Response Playbook incluye 4 lecciones en total.

¿Qué aprenderé en «Buenas prácticas de registro estructurado»?

Implemente un registro estructurado para facilitar el análisis y el procesamiento, y acelerar la depuración de problemas en producción. Practicas Production Debugging & Incident Response Playbook con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Production Debugging & Incident Response Playbook?

No se requiere experiencia previa. Production Debugging & Incident Response Playbook en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «Buenas prácticas de registro estructurado»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Production Debugging & Incident Response Playbook?

Sí. Cada lección de Production Debugging & Incident Response Playbook incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Buenas prácticas de registro estructurado
  2. Métricas, paneles y observabilidad
  3. Diseño de estrategias inteligentes de alertas
  4. Agregación y retención de logs
← Volver a Production Debugging & Incident Response Playbook