0Pricing
Production Debugging & Incident Response Playbook · Leçon

Bonnes pratiques de journalisation structurée

Mettez en œuvre une journalisation structurée pour faciliter l’analyse syntaxique et l’analyse, et accélérer le débogage des problèmes de production.

Bonnes pratiques de journalisation structurée est une leçon Production Debugging & Incident Response Playbook gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Production Debugging & Incident Response Playbook, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Production Debugging & Incident Response Playbook comprend 4 leçons au total.

Certaines parties de cette leçon n'ont pas encore été traduites et s'affichent en anglais.

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.

Questions Fréquemment Posées

La leçon « Bonnes pratiques de journalisation structurée » est-elle gratuite ?

Oui — le texte complet de « Bonnes pratiques de journalisation structurée » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Production Debugging & Incident Response Playbook, passe à CoddyKit PRO. Le cours Production Debugging & Incident Response Playbook comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Bonnes pratiques de journalisation structurée » ?

Mettez en œuvre une journalisation structurée pour faciliter l’analyse syntaxique et l’analyse, et accélérer le débogage des problèmes de production. Tu pratiques Production Debugging & Incident Response Playbook avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Production Debugging & Incident Response Playbook ?

Aucune expérience préalable n'est requise. Production Debugging & Incident Response Playbook sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.

Combien de temps prend la leçon « Bonnes pratiques de journalisation structurée » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Production Debugging & Incident Response Playbook ?

Oui. Chaque leçon Production Debugging & Incident Response Playbook inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Bonnes pratiques de journalisation structurée
  2. Métriques, tableaux de bord et observabilité
  3. Concevoir des stratégies d’alerte intelligentes
  4. Stratégies d’agrégation et de conservation des journaux
← Retour à Production Debugging & Incident Response Playbook