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
- Parsez en UTC d'abord - Évite les problèmes de fuseau horaire
- Validez la plage - Rejetez les dates implausibles
- Gérez les années manquantes - Syslog n'inclut pas l'année
- Utilisez des bibliothèques éprouvées - Ne réinventez pas la roue
- 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 !