Linux
Administration
Monitoring

Logs Linux 2026 : journalctl, syslog, rsyslog et logrotate complet

30 janvier 2026

12 min de lecture

Les logs sont essentiels pour comprendre, débugger et sécuriser un système Linux. Ce guide complet explique comment gérer, analyser et centraliser les logs avec journald, syslog et logrotate.

Comprendre les Logs Linux

Pourquoi les Logs ?

Les logs enregistrent tout ce qui se passe sur le système :

  • Démarrage : Services lancés, erreurs boot
  • Authentification : Connexions SSH, sudo
  • Applications : Erreurs, warnings, infos
  • Sécurité : Tentatives intrusion, modifications
  • Performance : Ressources, lenteurs

Analogie : Les logs sont comme une boîte noire d'avion - enregistrent tout pour analyse post-incident.

Deux Systèmes de Logs
SystèmeDescriptionStorage
journaldSystemd natif, binaire/run/log/journal/ (volatile) ou /var/log/journal/ (persistant)
syslogTraditionnel, texte/var/log/ (fichiers texte)

2026 : La plupart des distributions utilisent journald + rsyslog (compatibilité).


journalctl : Logs Systemd

Pour une exploration plus avancée des capacités de systemd, consultez notre guide systemd avancé couvrant timers, path units et troubleshooting.

Commandes de Base
# Tous les logs
journalctl

# Logs en temps réel (comme tail -f)
journalctl -f

# Depuis le dernier boot
journalctl -b

# Boot précédent
journalctl -b -1

# Lister boots disponibles
journalctl --list-boots

# Période spécifique
journalctl --since "2026-01-24 10:00"
journalctl --since "1 hour ago"
journalctl --since "yesterday"
journalctl --until "2026-01-24 11:00"
Filtrer par Service
# Logs d'un service
journalctl -u nginx

# Temps réel service
journalctl -u nginx -f

# Plusieurs services
journalctl -u nginx -u mysql

# Dernières 50 lignes
journalctl -u nginx -n 50

# Dernières lignes + suivi
journalctl -u nginx -n 20 -f
Filtrer par Priorité
# Niveaux : emerg, alert, crit, err, warning, notice, info, debug

# Seulement erreurs
journalctl -p err

# Erreurs et plus grave
journalctl -p err..emerg

# Par service et priorité
journalctl -u nginx -p warning

# Warnings du dernier boot
journalctl -b -p warning
Filtrer par Utilisateur/Process
# Logs d'un utilisateur
journalctl _UID=1000

# Par nom utilisateur
journalctl _UID=$(id -u www-data)

# Par PID
journalctl _PID=1234

# Par exécutable
journalctl _COMM=sshd

# Par chemin exécutable
journalctl _EXE=/usr/sbin/sshd
Format Output
# Format court (défaut)
journalctl

# Format détaillé
journalctl -o verbose

# JSON
journalctl -o json

# JSON pretty
journalctl -o json-pretty

# Format court avec timestamp
journalctl -o short-precise

# Seulement messages (pas metadata)
journalctl -o cat

# Export pour analyse
journalctl -o json > logs.json
Recherche dans Logs
# Grep dans journalctl
journalctl | grep -i error

# Meilleur : journalctl avec grep natif
journalctl -g "error|failed"

# Case insensitive
journalctl -g "ERROR" --case-sensitive=false

# Inverser match
journalctl --grep="success" --invert

# Combinaison
journalctl -u nginx -g "404|500" --since "1 hour ago"

Configuration journald

Fichier Configuration
# Configuration principale
sudo nano /etc/systemd/journald.conf

# Options importantes :

[Journal]
# Storage
Storage=persistent        # persistent, volatile, auto
SystemMaxUse=500M        # Max espace disque
RuntimeMaxUse=100M       # Max espace RAM
MaxRetentionSec=1month   # Durée conservation

# Taille fichiers
SystemMaxFileSize=50M
RuntimeMaxFileSize=10M

# Forward vers syslog
ForwardToSyslog=yes
ForwardToKMsg=no
ForwardToConsole=no

# Rate limiting
RateLimitIntervalSec=30s
RateLimitBurst=10000

# Appliquer changements
sudo systemctl restart systemd-journald
Gestion Espace Disque
# Voir espace utilisé
journalctl --disk-usage

# Nettoyer logs anciens
sudo journalctl --vacuum-time=7d    # Garder 7 jours
sudo journalctl --vacuum-size=500M  # Limiter à 500MB
sudo journalctl --vacuum-files=5    # Garder 5 fichiers

# Vérifier/réparer journal
sudo journalctl --verify

# Rotation manuelle
sudo systemctl kill --signal=SIGUSR2 systemd-journald

Syslog et rsyslog

Fichiers Logs Standards
# Logs système principaux
/var/log/syslog          # Tout (Debian/Ubuntu)
/var/log/messages        # Tout (RedHat/CentOS)

# Authentification
/var/log/auth.log        # SSH, sudo, login
/var/log/secure          # Auth (RedHat)

# Kernel
/var/log/kern.log        # Messages kernel
/var/log/dmesg           # Boot kernel

# Applications
/var/log/apache2/        # Apache
/var/log/nginx/          # Nginx
/var/log/mysql/          # MySQL

# Autres
/var/log/dpkg.log        # Apt installations
/var/log/boot.log        # Boot messages
/var/log/faillog         # Login échoués
/var/log/wtmp            # Connexions (binaire)
/var/log/btmp            # Tentatives échouées (binaire)
Configuration rsyslog
# Fichier principal
sudo nano /etc/rsyslog.conf

# Format configuration :
# facility.priority    action

# Exemples règles :
*.info;mail.none;authpriv.none;cron.none    /var/log/messages
authpriv.*                                  /var/log/secure
mail.*                                      /var/log/maillog
cron.*                                      /var/log/cron
*.emerg                                     :omusrmsg:*

# Facilities :
# kern, user, mail, daemon, auth, syslog, lpr, news,
# uucp, cron, authpriv, ftp, local0-local7

# Priorities :
# emerg, alert, crit, err, warning, notice, info, debug
Configuration Personnalisée
# Fichier custom
sudo nano /etc/rsyslog.d/50-myapp.conf

# Logs app vers fichier dédié
if $programname == 'myapp' then /var/log/myapp.log
& stop

# Logs critiques vers fichier spécial
*.crit    /var/log/critical.log

# Forward logs vers serveur distant
*.* @@log-server.example.com:514

# Redémarrer rsyslog
sudo systemctl restart rsyslog

logrotate : Rotation Logs

Pourquoi Rotation ?

Sans rotation, logs remplissent disque. logrotate :

  • Archive logs anciens
  • Compresse pour économiser espace
  • Supprime vieux logs
  • Exécuté quotidiennement via cron

Pour en savoir plus, consultez notre guide complet sur l'automatisation de la rotation des logs.

Configuration Globale
# Configuration principale
sudo nano /etc/logrotate.conf

# Paramètres défaut :
weekly              # Rotation hebdomadaire
rotate 4            # Garder 4 archives
create              # Créer nouveau fichier vide
dateext             # Ajouter date dans nom
compress            # Compresser archives
delaycompress       # Compresser à prochaine rotation

# Inclure configs spécifiques
include /etc/logrotate.d
Configuration par Application
# Nginx
sudo nano /etc/logrotate.d/nginx

/var/log/nginx/*.log {
    daily                    # Rotation quotidienne
    missingok               # Pas d'erreur si fichier absent
    rotate 14               # Garder 14 jours
    compress                # Compresser
    delaycompress           # Pas compresser dernier
    notifempty             # Pas rotation si vide
    create 0640 www-data adm  # Nouveau fichier permissions
    sharedscripts          # Script une seule fois
    postrotate
        # Recharger nginx après rotation
        if [ -f /var/run/nginx.pid ]; then
            kill -USR1 `cat /var/run/nginx.pid`
        fi
    endscript
}
Exemples Configurations

Application custom :

# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
    daily
    rotate 30
    compress
    delaycompress
    notifempty
    create 0644 myapp myapp
    sharedscripts
    postrotate
        systemctl reload myapp > /dev/null 2>&1 || true
    endscript
}

Logs critiques (garder longtemps) :

/var/log/audit/audit.log {
    monthly
    rotate 12
    compress
    notifempty
    create 0600 root root
}

Logs haute fréquence :

/var/log/highvolume.log {
    size 100M           # Rotation si > 100MB
    rotate 10
    compress
    notifempty
    copytruncate       # Copier puis tronquer (pas besoin reload app)
}
Tester logrotate
# Test (dry-run) configuration nginx
sudo logrotate -d /etc/logrotate.d/nginx

# Force rotation (pas dry-run)
sudo logrotate -f /etc/logrotate.d/nginx

# Test toutes configs
sudo logrotate -d /etc/logrotate.conf

# Verbose
sudo logrotate -v /etc/logrotate.conf

# État logrotate
cat /var/lib/logrotate/status

Analyse Logs

grep et Amis
# Chercher erreurs
grep -i error /var/log/syslog

# Avec contexte (3 lignes avant/après)
grep -C 3 "error" /var/log/syslog

# Compter occurrences
grep -c "failed" /var/log/auth.log

# Multiple fichiers
grep "error" /var/log/*.log

# Recursive
grep -r "error" /var/log/

# Inverser (tout sauf)
grep -v "success" /var/log/app.log
awk et sed
# Extraire colonne spécifique
awk '{print $5}' /var/log/syslog

# Logs SSH failed
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn

# Top 10 IPs tentatives SSH
awk '/Failed password/ {print $(NF-3)}' /var/log/auth.log | sort | uniq -c | sort -rn | head -10

# Logs entre 10h et 11h
sed -n '/10:00/,/11:00/p' /var/log/syslog
Outils Analyse

tail (monitoring temps réel) :

# Dernières 50 lignes
tail -n 50 /var/log/syslog

# Temps réel (suivi)
tail -f /var/log/syslog

# Multiple fichiers
tail -f /var/log/nginx/access.log /var/log/nginx/error.log

less (navigation) :

# Ouvrir log (navigation, recherche)
less /var/log/syslog

# Dans less :
# / : rechercher
# n : next occurrence
# N : previous
# G : fin fichier
# g : début fichier
# q : quitter

zgrep (logs compressés) :

# Chercher dans archives .gz
zgrep "error" /var/log/syslog.1.gz

# Tous logs (actuels + archives)
zgrep "error" /var/log/syslog*

Logs Applications Spécifiques

SSH Logs
# Connexions réussies
grep "Accepted" /var/log/auth.log

# Connexions échouées
grep "Failed password" /var/log/auth.log

# Par utilisateur
grep "user john" /var/log/auth.log

# Par IP
grep "192.168.1.100" /var/log/auth.log

# sudo commands
grep "sudo" /var/log/auth.log | grep COMMAND
Apache/Nginx Logs
# Access log format (Nginx)
# IP - user [date] "request" status bytes "referer" "user-agent"

# Requêtes 404
awk '$9 == 404' /var/log/nginx/access.log

# Requêtes 5xx (erreurs serveur)
awk '$9 ~ /^5/ ' /var/log/nginx/access.log

# Top 10 IPs
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

# Top URLs
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

# Bande passante par IP
awk '{ip[$1]+=$10} END {for (i in ip) print ip[i], i}' /var/log/nginx/access.log | sort -rn | head

# Erreurs Nginx
tail -f /var/log/nginx/error.log
MySQL Logs
# Error log
tail -f /var/log/mysql/error.log

# Slow queries
tail -f /var/log/mysql/mysql-slow.log

# Queries > 2 secondes
grep "Query_time" /var/log/mysql/mysql-slow.log | awk -F': ' '$2 > 2 {print}'

Centralisation Logs

Pourquoi Centraliser ?

Avantages :

  • Vue unifiée multiple serveurs
  • Logs persistés même si serveur down
  • Analyse corrélée
  • Alertes centralisées
rsyslog Serveur Central

Serveur (collecteur) :

# /etc/rsyslog.conf
# Activer réception UDP
module(load="imudp")
input(type="imudp" port="514")

# Activer réception TCP (plus fiable)
module(load="imtcp")
input(type="imtcp" port="514")

# Template par host
$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs

# Redémarrer
sudo systemctl restart rsyslog

# Ouvrir firewall
sudo ufw allow 514/tcp
sudo ufw allow 514/udp

Clients (serveurs) :

# /etc/rsyslog.d/50-remote.conf
# Forward tout vers serveur central

# UDP (rapide, peut perdre messages)
*.* @log-server.example.com:514

# TCP (fiable, garanti livraison)
*.* @@log-server.example.com:514

# Redémarrer
sudo systemctl restart rsyslog
journald vers Serveur Remote
# Forward journald vers rsyslog local, qui forward
# /etc/systemd/journald.conf
[Journal]
ForwardToSyslog=yes

sudo systemctl restart systemd-journald

Monitoring et Alertes

Script Surveillance Logs
#!/bin/bash
# /usr/local/bin/check-errors.sh

LOG_FILE="/var/log/syslog"
ALERT_EMAIL="admin@example.com"

# Compter erreurs dernière heure
ERRORS=$(journalctl --since "1 hour ago" -p err | wc -l)

if [ $ERRORS -gt 50 ]; then
    echo "High error rate: $ERRORS errors in last hour" | \
        mail -s "Alert: High Error Rate" $ALERT_EMAIL
fi

# Chercher patterns spécifiques
if grep -q "out of memory" $LOG_FILE; then
    echo "OOM detected!" | mail -s "Alert: OOM" $ALERT_EMAIL
fi

Pour des scripts de monitoring plus avancés, consultez notre guide sur les scripts de monitoring bash.

Cron Monitoring
# /etc/cron.hourly/check-logs
#!/bin/bash
/usr/local/bin/check-errors.sh

Pour planifier vos vérifications de logs, découvrez comment planifier des tâches avec cron.

logwatch (rapport quotidien)
# Installer
sudo apt install logwatch

# Configurer
sudo nano /etc/logwatch/conf/logwatch.conf

# Options :
Output = mail
Format = html
MailTo = admin@example.com
Range = yesterday
Detail = Med

# Test
sudo logwatch --detail High --range today --output stdout

# Rapport automatique quotidien
sudo logwatch --output mail

Logs Sécurité

Surveiller Tentatives Intrusion
# SSH brute force
grep "Failed password" /var/log/auth.log | \
    awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | \
    awk '$1 > 5 {print "Possible attack from " $2 " (" $1 " attempts)"}'

# Sudo abuse
grep "sudo" /var/log/auth.log | grep -v "session opened"

# Account changes
grep -E "user|group" /var/log/auth.log | grep -E "add|del|mod"

# Failed logins
lastb | head -20
fail2ban (auto-ban IPs)
# Installer
sudo apt install fail2ban

# Configuration
sudo nano /etc/fail2ban/jail.local

[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5

[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log

# Démarrer
sudo systemctl enable --now fail2ban

# Status
sudo fail2ban-client status
sudo fail2ban-client status sshd

# Débanner IP
sudo fail2ban-client set sshd unbanip 192.168.1.100

Troubleshooting avec Logs

Pour une gestion complète des services Linux, consultez notre guide sur la création et gestion des services systemd.

Service ne Démarre Pas
# 1. Systemd status
systemctl status nginx

# 2. Journal service
journalctl -u nginx -xe

# 3. Logs application
tail -f /var/log/nginx/error.log

# 4. Rechercher erreur spécifique
journalctl -u nginx | grep -i "failed\|error"

# 5. Vérifier config
nginx -t
Système Lent
# 1. Logs kernel (I/O errors, OOM)
journalctl -k -p err

# 2. Vérifier OOM killer
journalctl | grep -i "killed process"
dmesg | grep -i "out of memory"

# 3. Disk I/O errors
journalctl | grep -i "i/o error"

# 4. Systemd startup time
systemd-analyze blame
Crash Application
# Core dump
coredumpctl list
coredumpctl info <PID>

# Segfault dans logs
journalctl | grep -i segfault

# Stack trace
journalctl -u myapp | grep -A 20 "error"

Bonnes Pratiques

Niveaux Logs Appropriés
# Par environnement :
# Development : DEBUG
# Staging     : INFO
# Production  : WARNING

# Dans app (exemple Python)
import logging
logging.basicConfig(level=logging.WARNING)
Rotation Régulière
# Vérifier rotation fonctionne
sudo logrotate -d /etc/logrotate.conf

# Espace disque logs
du -sh /var/log/*

# Nettoyer si besoin
sudo journalctl --vacuum-time=7d
Sécuriser Logs
# Permissions restrictives
sudo chmod 640 /var/log/auth.log
sudo chown root:adm /var/log/auth.log

# Logs immuables (impossible modifier)
sudo chattr +a /var/log/critical.log  # Append only
sudo chattr +i /var/log/audit.log     # Immutable

# Voir attributs
lsattr /var/log/*.log
Checklist Logs
□ journald configuré (persistent)
□ logrotate actif (check cron)
□ Espace disque surveillé
□ Logs critiques centralisés
□ Alertes configurées (errors, security)
□ fail2ban actif (SSH)
□ Backup logs importants
□ Rétention définie (7j, 30j, 1an)

Conclusion

La gestion des logs Linux implique plusieurs composants :

Consulter logs :

journalctl -u service -f      # Systemd
tail -f /var/log/syslog       # Syslog
grep "error" /var/log/*.log   # Recherche

Configurer :

/etc/systemd/journald.conf    # journald
/etc/rsyslog.conf             # rsyslog
/etc/logrotate.d/             # rotation

Analyser :

journalctl -p err --since "1 hour ago"
awk '/Failed/ {print $11}' /var/log/auth.log | sort | uniq -c

Centraliser :

# Serveur : activer réception
# Clients : forward logs
*.* @@log-server:514

Avec ces outils, vous maîtrisez complètement les logs Linux pour debugging, sécurité et monitoring !

Besoin d'aide sur ce sujet ?

Notre équipe d'experts est là pour vous accompagner dans vos projets d'infrastructure et d'infogérance.

Contactez-nous

Articles similaires