[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 :
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 :
# 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
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 :
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!