Tutoriels

Analyser les Horodatages des Logs : Guide Pratique avec Exemples

Introduction

Les fichiers de logs contiennent des horodatages dans de nombreux formats différents. Savoir les parser correctement est essentiel pour l'analyse de logs, le monitoring et le débogage.

Ce que Vous Apprendrez

  • ✅ Formats courants d'horodatages dans les logs
  • ✅ Expressions régulières pour chaque format
  • ✅ Code de parsing en Python et JavaScript
  • ✅ Normalisation vers format standard
  • ✅ Gestion des fuseaux horaires

Formats de Log Courants

1. Apache/Nginx (CLF - Common Log Format)

[01/Dec/2024:10:15:30 +0000]

Regex :

regex
\[(\d{2}/\w{3}/\d{4}:\d{2}:\d{2}:\d{2} [+-]\d{4})\]

Python :

from datetime import datetime

def parse_apache(timestamp_str):
    # Exemple : "01/Dec/2024:10:15:30 +0000"
    return datetime.strptime(
        timestamp_str, 
        "%d/%b/%Y:%H:%M:%S %z"
    )

log_line = '[01/Dec/2024:10:15:30 +0000] "GET / HTTP/1.1" 200'
match = re.search(r'\[([^\]]+)\]', log_line)
if match:
    dt = parse_apache(match.group(1))
    print(dt.isoformat())

2. ISO 8601 / RFC 3339

2024-12-01T10:15:30Z
2024-12-01T10:15:30+01:00

Regex :

regex
\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:?\d{2})

JavaScript :

function parseIso8601(timestampStr) {
  return new Date(timestampStr);
}

// Exemple
const dt = parseIso8601("2024-12-01T10:15:30Z");
console.log(dt.toISOString());

3. Syslog (RFC 3164)

Dec  1 10:15:30 hostname app[123]: message

Note : Ce format N'inclut PAS l'année ni le fuseau horaire.

Python :

from datetime import datetime

def parse_syslog(timestamp_str, year=None):
    # Exemple : "Dec  1 10:15:30"
    if year is None:
        year = datetime.now().year

    dt = datetime.strptime(timestamp_str, "%b %d %H:%M:%S")
    return dt.replace(year=year)

# Extraire du log
import re
log_line = "Dec  1 10:15:30 serveur app[123]: erreur"
match = re.match(r'^(\w{3}\s+\d{1,2}\s\d{2}:\d{2}:\d{2})', log_line)
if match:
    dt = parse_syslog(match.group(1), year=2024)

4. Unix Timestamp

1701425730
1701425730000

JavaScript :

function parseUnixTimestamp(raw) {
  const str = String(raw);
  if (str.length === 10) {
    return new Date(Number(raw) * 1000);
  } else if (str.length === 13) {
    return new Date(Number(raw));
  }
  throw new Error('Format inconnu');
}

Parser Universel

Python

from datetime import datetime, timezone
from dateutil import parser as dateutil_parser
import re

def parse_log_timestamp(raw: str) -> datetime:
    """Parser universel pour horodatages de logs"""
    s = raw.strip()

    # 1. Essayer ISO 8601 / RFC 3339
    try:
        dt = dateutil_parser.isoparse(s)
        if dt.tzinfo is None:
            dt = dt.replace(tzinfo=timezone.utc)
        return dt
    except:
        pass

    # 2. Apache/Nginx: [01/Dec/2024:10:15:30 +0000]
    if s.startswith('[') and s.endswith(']'):
        inner = s[1:-1]
        dt = datetime.strptime(inner, "%d/%b/%Y:%H:%M:%S %z")
        return dt

    # 3. Unix timestamp numérique
    if s.isdigit():
        n = len(s)
        if n == 10:
            return datetime.fromtimestamp(int(s), tz=timezone.utc)
        if n == 13:
            return datetime.fromtimestamp(int(s)/1000, tz=timezone.utc)

    raise ValueError(f"Format non reconnu : {raw}")

Normalisation

Normalisez toujours vers un format standard après parsing :

def normaliser_timestamp(dt: datetime) -> dict:
    """Normalise datetime vers formats utiles"""
    utc = dt.astimezone(timezone.utc)
    return {
        'iso': utc.isoformat(),
        'unix_s': int(utc.timestamp()),
        'unix_ms': int(utc.timestamp() * 1000),
        'utc': utc
    }

Meilleures Pratiques

  1. Parsez en UTC d'abord - Évite les problèmes de fuseau horaire
  2. Validez la plage - Rejetez les dates implausibles
  3. Gérez les années manquantes - Syslog n'inclut pas l'année
  4. Utilisez des bibliothèques éprouvées - Ne réinventez pas la roue
  5. Enregistrez les erreurs de parsing - Pour le débogage

Résumé

Vous avez appris à parser les horodatages de :

  • Apache/Nginx (CLF)
  • ISO 8601 / RFC 3339
  • Syslog
  • Unix timestamps

Utilisez notre Convertisseur par Lots pour traiter plusieurs horodatages !