Auteur : Guillaume Lachenal (-G.-)

Date : Février 2006

Rotation des logs Apache

Sommaire

1. Avant propos

Suite à l'analyse des chiffres de 2005, un des administrateurs de SunWizard m'a demandé de documenter la mise en place la rotation des logs d'Apache.

2. Aperçu des logs d'Apache

Apache distingue les logs en 2 catégories :

  • les informations de fonctionnement du daemon : démarrage, arrêt, erreurs, que nous appelerons ErrorLog.
  • les requêtes http reçues et traitées, que nous appelerons CustomLog. Ce sont ces logs qui nous intéressent afin de produire des statistiques.

Dans sa configuration par défaut sous Solaris, Apache produit ses log dans les fichiers /var/apache/logs/error_log et /var/apache/logs/access_log.

Après quelques mois de fonctionnement et des milliers de visites sur un site web tel que SunWizard, les fichiers deviennent rapidemment volumineux et peu pratiques à analyser. Nous allons donc modifier la configuration pour obtenir un fichier journal par jour et stocké dans /var/apache/logs/ANNEE/MOIS/JOUR/ que nous noterons, à l'anglo-saxonne, YYYY/MM/DD

D'après la documentation, ErrorLog peut être redirigé :

  • dans un fichier, c'est la configuration par défaut
  • vers un programme externe, via un pipe (|/mon/programme/externe)
  • dans syslog

ErrorLog étant essentiellement à destination de l'administrateur système, nous choisissons la redirection vers syslog. Il suffit d'éditer le fichier /etc/apache/httpd.conf comme suit :

- ErrorLog /var/apache/logs/error_log

+ ErrorLog syslog:daemon

ErrorLog sera désormais disponible (en fonction de votre configuration de syslog) dans /var/adm/messages et la rotation assurée par /usr/lib/newsyslog tous les matins vers 3h10. (voir le crontab de root)

CustomLog n'est pas prévu pour être redirigé dans syslog, même si les plus imaginatifs d'entre vous font appel à |/usr/bin/logger. Plusieurs solutions s'offrent néanmoins à nous :

3. Rotation par script

La rotation peut être assurée par l'appel quotidien (via cron) à un simple script shell :

#!/opt/csw/bin/bash

 

# GNU date from CSWshutils

YESTERDAY=`/opt/csw/bin/gdate -d -1day +%Y/%m/%d`

TARGET=/var/apache/logs/$YESTERDAY

 

mkdir -m 755 -p $TARGET

mv /var/apache/logs/access_log $TARGET/access_log

/usr/apache/bin/apachectl graceful

 

apachectl graceful permet de créer de nouveaux fichiers logs (/var/apache/logs/access_log)

4. rotatelogs

La fondation Apache fournit un programme dédié à la rotation de logs : rotatelogs

Tout comme httpd, il est disponible sous Solaris dans le paquet SUNWapchu et devrait donc être disponible sur votre machine. Il peut être appelé via un pipe. Il prend comme argument le fichier de logs et le delai entre 2 rotations, exprimé en secondes. Pour une rotation quotidienne, modifiez /etc/apache/httpd.conf comme suit :

+ CustomLog "|/usr/apache/bin/rotatelogs /var/apache/logs/access_log 86400" common

Vous obtenez des fichiers access_log.xxxx, ou xxxx est la date de rotation en secondes depuis le 1er janvier 1970.

Je vous défie de retrouver ainsi les logs du mois dernier ;-) Là encore, un petit script de votre cru permettra d'organiser ces fichiers sous la forme YYYY/MM/DD

#!/opt/csw/bin/bash

 

# GNU date from CSWshutils

YESTERDAY=`/opt/csw/bin/gdate -d -1day +%Y/%m/%d`

TARGET=/var/apache/logs/$YESTERDAY

LASTLOG=`ls -1t /var/apache/logs/access_log.* | head -1`

 

mkdir -m 755 -p $TARGET

mv $LASTLOG $TARGET/access_log

 

5. cronolog

Andrew Ford nous propose Cronolog. Ce programme assure la rotation et le nommage des fichiers sous la forme YYYY/MM/DD. Il n'est pas disponible par défaut dans Solaris, mais un articlesuteur de Blastwave nous a préparé un package.

Nous l'installons avec la commande habituelle :

# pkg-get install cronolog

Si vous n'utilisez pas le projet Blastwave, sachez que ce paquet n'a aucune dependance. Vous pouvez donc le télécharger et l'installer à l'aide de pkgadd.

Vous pouvez maintenant modifier /etc/apache/httpd.conf :

+ CustomLog "|/opt/csw/sbin/cronolog /var/apache/logs/%Y/%m/%d/access_log" common

Cronolog propose également un binaire pour découper vos logs existantes (cronosplit). Une option également intéressante est la possibilité d'avoir un lien symbolique vers le fichier de log pour le jour courant. Je vous renvoie à la documentation sur le site du projet.

6. syslog-ng

syslog-ng de Balazs Scheidler est une version grandement améliorée du traditionnel syslogd. Certains d'entre vous l'utilisent peut-être déjà. Le classement sous la forme YYYY/MM/DD y est prévu, la rotation est donc assurée.

Nous allons donc rediriger les logs d'Apache via un appel à logger :

+ CustomLog "| /usr/bin/logger -p local7.info -t apache_access_log" common

Modifiez votre fichier /etc/syslog-ng/syslog-ng.conf comme suit :

source src {

   sun-stream("/dev/log" door("/etc/.syslog_door"));

   internal();

};

 

destination d_access_log  {

   file( "/var/apache/logs/$YEAR/$MONTH/$DAY/access_log" create_dirs(yes) );

};

 

filter f_access_log {

   facility(local7) and level(info) and program(apache_access_log);

};

 

log  {

   source(src);

   filter(f_access_log);

   destination(d_access_log);

};

 

7. Notes

Après chaque modification de configuration, il faut forcer les daemons à adopter les nouvelles directives en leur envoyant le signal SIGHUP, via pkill. Pour Apache, il est même préférable de lui envoyer SIGUSR1.

Plusieurs directives CustomLog peuvent être renseignées dans le fichier de configuration. Pourquoi ne pas combiner plusieurs solutions le temps de faire votre choix ?

Si vous hébergez plusieurs sites, sachez que la directive CustomLog peut également être utilisée dans le contexte <VirtualHost>. Vous pourrez ainsi placez vos fichiers dans /var/apache/logs/mon.site.com/YYYY/MM/DD/access_log.

Les informations logguées peuvent être personnalisées. Il s'agit de la directive LogFormat. N'hésitez pas à l'adapter à vos besoins.

8. Liens

Dernière mise à jour de cette page : Mercredi 8 février 2006. Version : 0.99.8

Rédigé avec Mimine

[ Accueil | Editorial | Forums | Petites Annonces | Articles | Téléchargement | Sélection de Liens | Infos Site | ]