Configurer Apache et Rsyslog

août 17, 2013 · Posted in GNU/Linux · 4 Comments 

Le problème d’Apache aujourd’hui, c’est que ses logs « access » ne peuvent pas être redirigés nativement vers un autre logger.

Vous allez me dire : ok, mais quel intérêt ?

Et bien si comme moi vous avez un mis en place des outils de corrélation de logs, vous souhaitez sans doute analyser tous les logs de vos différents serveurs WWW.

Pour remédier au problème d’Apache, voici une méthode à moi qui fonctionne plutôt pas mal.

Pour pouvoir envoyer ces logs vers une autre machine, je vais utiliser un « logger » externe.

Création du logger :

vi /usr/local/sbin/apache_syslog

Copiez/coller ce bout de code :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl
use Sys::Syslog qw (:DEFAULT setlogsock);
 
setlogsock('unix');
 
# creation du log socket
openlog('httpd', 'pid', 'local6');
 
# on log tout
while () {
syslog('info', $_);
}
 
# fermeture du log socket
closelog;

Enregistrez et fermez.

Pensez à faire

chmod +x /usr/local/sbin/apache_syslog

 

Redirection des logs « Error »

Par défaut, Apache log tout vers des fichiers. Les erreurs sont donc loggées vers error.log.

Ce qui nous intéresse ici, c’est de récupérer ces erreurs sur une machine distante.

Je vais donc remplacer, pour chaque virtualhost, la directive

ErrorLog ${APACHE_LOG_DIR}/error.log

par

ErrorLog |/usr/local/sbin/apache_syslog

 

Redirection des logs « Access »

Comme vous l’avez fait pour les logs Error, vous allez, pour chacun des virtualhost que vous hébergez, modifier la ligne

CustomLog ${APACHE_LOG_DIR}/access.log combined

par

CustomLog |/usr/local/sbin/apache_syslog combined

Une fois terminé, pensez à redémarrer Apache.

Désormais, vos logs access et error sont dans syslog.

Deux options s’offrent à vous : les laisser là, ou les envoyez sur une autre machine qui vous sert de corrélateur.

 

Rediriger ces logs vers une machine distante

C’est très simple :

Dans /etc/rsyslog.d/, créez un fichier qui se nomme

10-apache.conf

et ajoutez les lignes suivantes :

1
2
:programname,contains,"httpd" @ip_address_distante
& ~

Enregistrez, fermez et relancez rsyslog

service rsyslog restart

Désormais, tous vos logs d’Apache sont envoyés à la machine dont l’adresse ip est celle que vous avez renseignée.

Simple, rapide et efficace !