Aller au contenu

[Snippet] afficher l'hôte dans les logs d'Apache

Pour continuer sur ma lancée des petites configs Apache utiles (cf catégorie Serveur web), en voici une concernant les logs.

Besoin

Lorsqu'on utilise Apache avec plusieurs (sous-)domaines, il est courant d'utiliser des fichiers de logs séparés pour chaque vhost sur le modèle /var/log/apache2/mon_vhost_access.log et /var/log/apache2/mon_vhost_error.log.

Mais dans certains cas, on peut vouloir rassembler les logs des différents vhosts dans un même fichier. Cependant, les formats par défaut des logs ne permettent pas de distinguer quel vhost a déclenché l'écriture d'un log en particulier.

Explications

Pour solutionner cela, il faut changer le format des logs d'accès (/var/log/apache2/*access.log). Ceux-ci sont généralement configurés sous une forme semblable à :

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

Notez bien le combined : il désigne un des format de log prédéfinis d'Apache :

Extrait de la version par défaut de /etc/apache2/apache2.conf
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

Pour plus d'infos sur les éléments possibles d'afficher, voir dans la doc.

Solution

Il suffit alors de définir un nouveau format « maison » affichant en plus le Host. Mais ne modifions pas apache2.conf, afin d'éviter tout conflit lors des mises à jour d'Apache.

Il est préférable de se créer un fichier de configuration additionnel. Par exemple :

/etc/apache2/conf-available/custom-logs.conf
# define a log format like "combined" but with the Host header too
# so that "catchall" vhosts help identify which host was called
LogFormat "%h %l %u %t %{Host}i \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined_with_host

Comme il est placé dans conf-available, il convient de l'activer :

a2enconf custom-logs.conf
Cela va juste créer un lien symbolique dans conf-enabled vers ce fichier, sur le même principe que les vhosts.

Il suffit ensuite d'utiliser ce nouveau format dans les vhosts concernés  :

extrait de vhost
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined_with_host

Conclusion

Profit 💰

Et si vous souhaitez en faire de même sur les formats du log d'erreur, il existe la directive équivalente ErrorLogFormat (mais elle ne se règle qu'une fois, à l'échelle du serveur, pas au niveau des vhosts).

Keep calm and script EVERYTHING!