guest@6admin.io:~$

Apache : quel bavard

Apache parle. Beaucoup. Chaque requête génère une ligne dans le access_log, chaque erreur une ligne dans le error_log et le LogLevel contrôle le niveau de bavardage. Sur un serveur qui sert 100 000 pages par jour, le access_log pèse 50 Mo par jour et personne ne le lit.

Le LogLevel

LogLevel warn

Les niveaux, du plus bavard au plus silencieux: debug, info, notice, warn, error, crit, alert, emerg. Le warn est le défaut et le bon: il logge les warnings (config, permissions) et les erreurs, mais pas chaque module qui démarre.

Le debug est utile pendant une session de débogage, mais il produit 50 lignes par requête (chaque module, chaque règle de rewrite, chaque header traité). En production, le debug est un disque dur qui se remplit.

Le LogFormat

Le défaut combined donne le User-Agent et le Referer en plus du classique:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog /var/log/apache2/access.log combined

Ce que le access_log raconte: l’IP source, le timestamp, la méthode + URL + protocole, le code de retour, la taille, le Referer (d’où vient l’utilisateur) et le User-Agent (quel navigateur, quel OS, quel bot). Un access_log est une base de données comportementale et personne ne le traite comme tel.

Ce qu’on y trouve

  • Les bots de scan: /phpmyadmin, /wp-admin, /etc/passwd, /shell.php (les IPs que fail2ban bannit)
  • Les référents de spam (les domaines qui prétendent vous linker pour apparaître dans vos stats)
  • Les User-Agents de scanners (sqlmap, nikto, sqlninja) qui se distinguent des navigateurs par leur pattern
  • Les requêtes qui ne passent pas le 200: les 404 sur des fichiers qui n’existent pas, les 403 sur des fichiers protégés, les 500 sur les erreurs applicatives

La rotation

CustomLog "|/usr/bin/rotatelogs /var/log/apache2/access.log 86400" combined

Le rotatelogs d’Apache rotationne le log toutes les 86400 secondes (24h) sans arrêter Apache. La compression et le nettoyage sont dans le logrotate:

/var/log/apache2/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
}

14 jours de logs compressés, les deux premiers jours non compressés (delaycompress, pour le tail en cours).

[edit: 2026] Le LogFormat combined est toujours le standard, mais les access logs modernes sont parsés par des pipelines (GoAccess en temps réel, ELK pour l’agrégation, fail2ban pour le ban). Le User-Agent est devenu le champ le plus menteur: les bots se font passer pour Chrome depuis 2020 et le Referer est vide pour les connexions HTTPS vers HTTP. Le log raconte toujours tout, mais il faut lire entre les lignes.