J’avais besoin de centraliser mes logs pour les exploiter plus facilement. Voici ma petite contribution pour mettre ce système en place très facilement sur Ubuntu avec syslog-ng.
Configuration du serveur de logs avec syslog-ng :
Pré-requis : syslog-ng installé sur le serveur et les clients.
Définir la source des logs dans syslog-ng.conf :
source s_net { tcp(port(1000)); };
on définit ici, une nouvelle source de logs à savoir le réseau. S’agissant d’un serveur, je part du principe que je ne définit pas d’adresse IP source pour pouvoir rajouter facilement des clients sans modifier la configuration du serveur : je me trouve dans un LAN donc les risques sont réduits, par contre je définis un port spécifique qui me permets quand même de mettre des verrous au niveau du pare-feu..
Puis on gére l’alimentation des fichiers de logs en fonction de leurs sources :
La gestion des logs reçus est relativement logique et simple. Ayant définit une source de logs, il suffit ensuite de déterminer un filtre en fonction des « facility » qui seront définis sur les clients. Pour des raisons de simplifications, j’envoi tous les logs (error et access) des serveurs apache distants dans le meme fichier de log. On peut les dissocier grace aux facilitys.
########################
# Log Apache distant
########################
filter f_dapache {facility(local1, local4); };
destination d_distant {
file("/var/log/apache_distant_log");
};
log {
filter(f_dapache);
source(s_net);
destination(d_distant);
};
########################
# Log Squid Distant
########################
filter f_dsquid {facility(local3); };
destination d_distantsquid {
file("/var/log/squid_distant_log");
};
log {
filter(f_dsquid);
source(s_net);
destination(d_distantsquid);
};
Configuration des clients :
En premier lieu, le serveur apache ne sait envoyer ses logs à syslog que pour les erreurs. Pour les récupérer, il faut obligatoirement les renvoyer sur un script par le biais d’un « pipe ». Il ne faut pas oublier la définition que nous avons donner aux « facilitys » : local1 pour les logs « error » d’apache, local4 pour logs « access » et local3 pour les logs de Squid.
Commencons par le script. Dans /usr/local/bin, créer le fichier log_apache.sh, et y mettre le code suivant :
#!/usr/bin/perl
use Sys::Syslog qw( : DEFAULT setlogsock );
setlogsock('unix');
openlog('apache', 'cons', 'local4');
while ($log = <STDIN>) {
syslog('info', $log);
}
closelog
Lui attribuer les droits d’éxécution.
Configuration d’apache :
Ajouter la directive :
CustomLog |/usr/local/bin/apache_syslog combined
Modifier la directive :
ErrorLog syslog:local1
Et régler le niveau de log désiré pour les erreurs :
LogLevel info
Configuration de syslog-ng dans syslog-ng.conf :
Définir la destination des logs, avec l’adresse IP du serveur et le port sur lequel celui-ci recevra les logs :
# Envoyer au server
destination d_net { tcp("192.168.0.1" port(1000)); };
définir les logs qui seront transmis au serveur, les trois « facilitys » que l’on souhaite suivre :
filter f_serv { facility(local1, local3, local4); };
Puis on définit le log ainsi :
log {
source(s_all);
filter(f_serv);
destination(d_net);
};
Relancer le serveur apache et le daemon syslog-ng.
Configuration de Squid dans squid.conf :
Modifier la directive :
access_log syslog:local3.info
puis relancer Squid.



1 mars 2011 à 16:26
Bonjour,
J’ai un petit souci svp : j’ai un probleme au niveau d’Apache, il refuse de se connecter. Quelqu’un aurait une réponse à proposer? Merci.
4 mars 2011 à 15:11
bonjour,
Pourriez-vous être un peu plus précis sur le probléme ? je comprends qu’apache n’envoie pas les logs sur le serveur.
Je vérifierais en premier lieu qu’apache alimente bien syslog sur le serveur « client » puis les adresses ip mentionnés dans les fichiers de conf de syslog.
14 juillet 2011 à 00:30
Bonjour,
en utilisant cette méthode le STDIN contient la ligne à inscrire dans le fichier log. En le redirigeant vers le serveur log, ce STDIN devient le message à envoyer. Du coup dans le fichier log du serveur on a une redondance du timestamp (celui du serveur et ensuite dans le corp du message dont le timestamp correspond à celui du client). J’espere avoir été clair. Comment enlever cette redondance ?
merci
31 octobre 2011 à 07:35
Merci, exactement ce que j’avais besoin !