blob: 193167747eace5e6cb5fdf3a4ec5e7ea5093d646 [file]
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE manualpage SYSTEM "./style/manualpage.dtd">
<?xml-stylesheet type="text/xsl" href="./style/manual.fr.xsl"?>
<!-- French translation : Lucien GENTIS -->
<!-- Reviewed by : Vincent Deffontaines -->
<!-- English Revision: 1935747 -->
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<manualpage metafile="logs.xml.meta">
<title>Fichiers journaux</title>
<summary>
<p>Pour véritablement gérer un serveur web,
il est nécessaire de disposer d'un
retour d'informations à propos de l'activité et des performances du
serveur, ainsi que de tout problème qui pourrait survenir. Le serveur HTTP
Apache propose des fonctionnalités de journalisation souples et très
complètes. Ce document décrit comment configurer ces fonctionnalités de
journalisation et interpréter le contenu des journaux.</p>
</summary>
<section id="overview">
<title>Vue d'ensemble</title>
<related>
<modulelist>
<module>mod_log_config</module>
<module>mod_log_forensic</module>
<module>mod_logio</module>
<module>mod_cgi</module>
</modulelist>
</related>
<p>
Le serveur HTTP Apache fournit toute une variété de mécanismes
différents pour la journalisation de tout ce qui peut se passer au
sein de votre serveur, depuis la requête initiale, en passant par le
processus de mise en correspondance des URLs, et jusqu'à la fermeture
de la connexion, y compris toute erreur pouvant survenir au cours du
traitement. De plus, certains modules tiers fournissent des
fonctionnalités de journalisation ou insèrent des entrées dans les
fichiers journaux existants, et les applications comme les programmes
CGI, les scripts PHP ou autres gestionnaires peuvent envoyer des
messages vers le journal des erreurs du serveur.
</p>
<p>
Ce document décrit le fonctionnement des modules de journalisation
fournis en standard avec le serveur httpd.
</p>
</section>
<section id="security">
<title>Avertissement à propos de la sécurité</title>
<p>Tout utilisateur qui a les droits en écriture sur le répertoire dans
lequel Apache httpd écrit ses journaux pourra quasi
certainement avoir accès à l'uid sous lequel le serveur est démarré, en
l'occurrence habituellement root. N'accordez <em>PAS</em> aux utilisateurs
l'accès en écriture au répertoire dans lequel les journaux sont stockés
sans savoir exactement quelles en seraient les conséquences ; voir le
document <a href="misc/security_tips.html">conseils sur la sécurité</a>
pour plus de détails.</p>
<p>En outre, les journaux peuvent contenir des informations fournies
directement par un client, sans caractères d'échappement. Des clients mal
intentionnés peuvent donc insérer des caractères de contrôle dans les
journaux, et il convient par conséquent d'être très prudent lors de la
manipulation des journaux bruts.</p>
</section>
<section id="errorlog">
<title>Journal des erreurs</title>
<related>
<modulelist>
<module>core</module>
</modulelist>
<directivelist>
<directive module="core">ErrorLog</directive>
<directive module="core">ErrorLogFormat</directive>
<directive module="core">LogLevel</directive>
</directivelist>
</related>
<p>Le journal des erreurs du serveur, dont le nom et la localisation sont
définis par la directive <directive module="core">ErrorLog</directive>,
est le journal le plus important. C'est dans celui-ci
que le démon Apache httpd va envoyer les informations de diagnostic et
enregistrer toutes les erreurs qui surviennent lors du traitement des
requêtes. Lorsqu'un problème survient au démarrage du serveur ou pendant
son fonctionnement, la première chose à faire est de regarder dans ce
journal, car il vous renseignera souvent sur le problème rencontré et
la manière d'y remédier.</p>
<p>Le journal des erreurs est habituellement enregistré dans un fichier
(en général <code>error_log</code> sur les systèmes de type Unix et
<code>error.log</code> sur Windows et OS/2). Sur les systèmes de type Unix,
le serveur peut aussi enregistrer ses erreurs dans
<code>syslog</code> ou les
<a href="#piped">rediriger vers un programme</a> par l'intermédiaire d'un
tube de communication (pipe).</p>
<p>Le format du journal des erreurs est défini à l'aide de la directive <directive
module="core">ErrorLogFormat</directive> avec laquelle vous pouvez
choisir les valeurs à journaliser. Un format par défaut sera utilisé si vous
n'en spécifiez pas un. Un message de journalisation typique se présente
comme suit&nbsp;:</p>
<example>
[Fri Sep 09 10:42:29.902022 2011] [core:error] [pid 35708:tid 4328636416]
[client 72.15.99.187] AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error
</example>
<p>Le premier champ de l'entrée du journal est la date et l'heure du
message. Le second champ indique le module qui produit le message (core,
dans ce cas) et le niveau de sévérité de ce message. Suivent l'ID du processus
et éventuellement l'ID du thread du processus qui a été soumis à cette
condition. Le
troisième champ contient l'adresse IP du client qui a effectué la requête.
Vient ensuite le message d'erreur détaillé.</p>
<note><p>Notez que certains messages qui étaient auparavant journalisés au
niveau <code>error</code> ont été rétrogradés au niveau <code>info</code>
dans httpd 2.4. Par exemple, les messages "File does not exist" pour les
réponses 404 sont journalisés au niveau <code>info</code> et n'apparaîtront
pas dans le journal des erreurs avec la valeur par défaut <code>warn</code>
de la directive <directive module="core">LogLevel</directive>. Pour
restaurer le comportement précédent, spécifiez <code>LogLevel warn
core:info</code>.</p></note>
<p>Une grande variété de messages différents peuvent apparaître dans le
journal des erreurs. La plupart d'entre eux sont similaires à l'exemple
ci-dessus. Le journal des erreurs peut aussi contenir des informations de
débogage en provenance de scripts CGI. Toute information qu'un script CGI
écrit sur la sortie d'erreurs standard <code>stderr</code> sera recopiée
telle quelle dans le journal des erreurs.</p>
<p>Mettre un symbole <code>%L</code> dans le journal des erreurs et le
journal des accès produit un ID d'entrée de journalisation grâce auquel
vous pourrez corréler l'entrée du journal des erreurs avec celle du journal
des accès. Si <module>mod_unique_id</module> est chargé, son ID de requête
unique sera utilisé comme ID d'entrée de journalisation.</p>
<p>Pendant la phase de test, il est souvent utile de visualiser en continu
le journal des erreurs afin de détecter tout problème éventuel. Sur les
systèmes de type Unix, ceci s'effectue à l'aide de la commande :</p>
<example>
tail -f error_log
</example>
</section>
<section id="permodule">
<title>Journalisation par module</title>
<p>La directive <directive module="core">LogLevel</directive> permet
de spécifier un niveau de sévérité de journalisation pour chaque
module. Vous pouvez ainsi résoudre un problème propre à un module particulier
en augmentant son volume de journalisation sans augmenter ce volume
pour les autres modules. Ceci est particulièrement utile lorsque
vous voulez obtenir des détails sur le fonctionnement de modules
comme <module>mod_proxy</module> ou <module>mod_rewrite</module>.</p>
<p>Pour ce faire, vous devez spécifier le nom du module dans votre
directive <directive>LogLevel</directive> :</p>
<example>
<highlight language="config">
LogLevel info rewrite:trace5
</highlight>
</example>
<p>Dans cet exemple, le niveau de journalisation général est défini
à info, et à <code>trace5</code> pour <module>mod_rewrite</module>.</p>
<note>Cette directive remplace les directives de journalisation par
module des versions précédentes du serveur, comme
<code>RewriteLog</code>.</note>
</section>
<section id="accesslog">
<title>Journal des accès</title>
<related>
<modulelist>
<module>mod_log_config</module>
<module>mod_setenvif</module>
</modulelist>
<directivelist>
<directive module="mod_log_config">CustomLog</directive>
<directive module="mod_log_config">LogFormat</directive>
<directive module="mod_setenvif">SetEnvIf</directive>
</directivelist>
</related>
<p>Le journal des accès au serveur
enregistre toutes les requêtes que traite
ce dernier. La localisation et le contenu du journal des accès sont définis
par la directive <directive module="mod_log_config">CustomLog</directive>.
La directive <directive module="mod_log_config">LogFormat</directive>
permet de simplifier la sélection du contenu du journal. Cette section
décrit comment configurer le serveur pour l'enregistrement des informations
dans le journal des accès.</p>
<p>Le stockage d'informations dans le journal des accès
n'est que le point de départ de la gestion de la journalisation. L'étape
suivante consiste à analyser ces informations de façon à pouvoir en
extraire des statistiques utiles. L'analyse de journaux en général est en
dehors du sujet de ce document et ne fait pas vraiment partie intégrante
du travail du serveur web lui-même.
</p>
<p>Différentes versions du démon Apache httpd utilisaient d'autres modules
et directives pour contrôler la journalisation des accès, à l'instar de
mod_log_referer, mod_log_agent, et de la directive
<code>TransferLog</code>. La directive
<directive module="mod_log_config">CustomLog</directive> rassemble
désormais les fonctionnalités de toutes les anciennes directives.</p>
<p>Le format du journal des accès est hautement configurable. Il est
défini à l'aide d'une chaîne de format qui ressemble sensiblement à la
chaîne de format de style langage C de printf(1). Vous trouverez quelques
exemples dans les sections suivantes. Pour une liste exhaustive de ce que
peut contenir une chaîne de format, vous pouvez vous référer au chapitre
<a href="mod/mod_log_config.html#formats">chaînes de format</a> de la
documentation du module <module>mod_log_config</module>.</p>
<section id="common">
<title>Format habituel du journal</title>
<p>Voici une configuration typique pour le journal des accès :</p>
<example>
<highlight language="config">
LogFormat "%h %l %u %t \"%r\" %&gt;s %b" common
CustomLog "logs/access_log" common
</highlight>
</example>
<p>Ici est définie l'<em>identité</em> <code>common</code> qui est
ensuite associée à une chaîne de format de journalisation particulière.
La chaîne de format est constituée de directives débutant par le
caractère %, chacune d'entre elles indiquant au serveur d'enregistrer
un élément particulier d'information. Des caractères littéraux peuvent
aussi être insérés dans la chaîne de format ; il seront copiés tels
quels dans le flux de sortie destiné à la journalisation.
Les guillemets (<code>"</code>) doivent être échappées en les faisant
précéder d'un anti-slash (<code>\</code>) afin qu'elles ne soient pas
interprétées comme la fin de la chaîne de format. La chaîne de format
peut aussi contenir les caractères de contrôle spéciaux
"<code>\n</code>" et "<code>\t</code>" pour insérer respectivement
un passage à la ligne et une tabulation.</p>
<p>La directive <directive module="mod_log_config">CustomLog</directive>
définit un nouveau fichier journal en l'associant à l'identité
précédemment définie. Le chemin du nom de fichier associé au journal
des accès est relatif au chemin défini par la directive
<directive module="core">ServerRoot</directive>, sauf s'il
débute par un slash.</p>
<p>La configuration ci-dessus va enregistrer les entrées de
journalisation selon un format connu sous le nom de
Common Log Format (CLF) pour "Format de journalisation standard".
Ce format standard peut être produit par de nombreux serveurs web
différents et lu par de nombreux programmes d'analyse de journaux.
Les entrées de fichier journal générées selon le format CLF
ressemblent à ceci :</p>
<example>
127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET
/apache_pb.gif HTTP/1.0" 200 2326
</example>
<p>Chaque partie de cette entrée de journal est décrite
dans ce qui suit.</p>
<dl>
<dt><code>127.0.0.1</code> (<code>%h</code>)</dt>
<dd>Il s'agit de l'adresse IP du client (l'hôte distant) qui a envoyé
la requête au serveur. Si la directive
<directive module="core">HostnameLookups</directive> est positionnée à
<code>On</code>, le serveur va essayer de déterminer le nom de l'hôte
et de l'enregistrer à la place de l'adresse IP. Cette configuration
n'est cependant pas recommandée car elle peut ralentir le serveur de
manière significative. Il est par conséquent préférable d'utiliser un
processeur d'analyse de journaux a posteriori
tel que <program>logresolve</program>
pour déterminer les noms d'hôte. L'adresse IP indiquée ici n'est pas
nécessairement l'adresse IP de la machine devant laquelle se trouve
l'utilisateur. Si un serveur mandataire s'intercale entre le serveur
et l'utilisateur, l'adresse indiquée sera celle du mandataire et non
celle de la machine à l'origine de la requête.</dd>
<dt><code>-</code> (<code>%l</code>)</dt>
<dd>Le "trait d'union" indique que la portion d'information
correspondante n'est pas disponible. Dans le cas présent, l'information
non disponible est l'identité (RFC 1413) du client telle que déterminée
par <code>identd</code> sur la machine cliente. Cette information est
très peu fiable et ne devrait jamais être utilisée, sauf dans le cas
de réseaux internes étroitement contrôlés. Le démon httpd ne cherchera
d'ailleurs à obtenir cette information que si la directive
<directive module="mod_ident">IdentityCheck</directive> est positionnée
à <code>On</code>.</dd>
<dt><code>frank</code> (<code>%u</code>)</dt>
<dd>Il s'agit de l'identifiant utilisateur de la personne qui a
demandé le document, issu d'une authentification HTTP.
Ce même identifiant est en général fourni aux scripts CGI par
l'intermédiaire de la valeur de la variable d'environnement
<code>REMOTE_USER</code>. Si le statut de la requête (voir plus loin)
est 401, cette identifiant n'est pas fiable car l'utilisateur n'est
pas encore authentifié. Si le document n'est pas protégé par
mot de passe, cette partie d'information sera représentée par
"<code>-</code>", comme la partie précédente.</dd>
<dt><code>[10/Oct/2000:13:55:36 -0700]</code>
(<code>%t</code>)</dt>
<dd>
L'heure à laquelle la requête a été reçue.
Le format est le suivant :
<p class="indent">
<code>[jour/mois/année:heure:minutes:secondes zone]<br />
jour = 2*chiffre<br />
mois = 3*lettre<br />
année = 4*chiffre<br />
heure = 2*chiffre<br />
minutes = 2*chiffre<br />
secondes = 2*chiffre<br />
zone = (`+' | `-') 4*chiffre</code>
</p>Il est possible de modifier le format d'affichage de l'heure
en spécifiant <code>%{format}t</code> dans la chaîne de format du
journal, où <code>format</code> est une chaîne de format
de la forme de celle de la fonction <code>strftime(3)</code>
de la bibliothèque C standard, ou choisie parmi les
formats spéciaux supportés. Pour plus de détails,
reportez-vous aux. <a
href="mod/mod_log_config.html#formats">chaînes de format</a>
de <module>mod_log_config</module>.
</dd>
<dt><code>"GET /apache_pb.gif HTTP/1.0"</code>
(<code>\"%r\"</code>)</dt>
<dd>La ligne de la requête du client est placée entre guillemets.
Elle contient de nombreuses informations utiles. Tout d'abord, la
méthode utilisée par le client est <code>GET</code>. Ensuite, le
client a demandé la ressource <code>/apache_pb.gif</code>, et enfin,
le client a utilisé le protocole <code>HTTP/1.0</code>. Il est aussi
possible d'enregistrer séparément une ou plusieurs parties de la
requête. Par exemple, la chaîne de format "<code>%m %U %q %H</code>"
va enregistrer la méthode, le chemin, la chaîne de la requête et le
protocole, ce qui donnera le même résultat que
"<code>%r</code>".</dd>
<dt><code>200</code> (<code>%&gt;s</code>)</dt>
<dd>C'est le code de statut que le serveur retourne au client. Cette
information est très importante car elle indique si la requête a fait
l'objet d'une réponse positive (codes commençant par 2), une
redirection (codes commençant par 3), une erreur due au client (codes
commençant par 4), ou une erreur due au serveur (codes commençant
par 5). Vous trouverez la liste complète des codes de statut possibles
dans la spécification
HTTP (<rfc>2616</rfc>) (RFC2616 section 10).</dd>
<dt><code>2326</code> (<code>%b</code>)</dt>
<dd>La dernière partie indique la taille de l'objet retourné au client,
en-têtes non compris. Si aucun contenu n'a été retourné au client, cette
partie contiendra "<code>-</code>". Pour indiquer l'absence de contenu
par "<code>0</code>", utilisez <code>%B</code> au lieu de
<code>%b</code>.</dd>
</dl>
</section>
<section id="combined">
<title>Combined Log Format (Format de journalisation combiné)</title>
<p>Une autre chaîne de format couramment utilisée est le
"Combined Log Format" (Format de journalisation combiné). Il s'utilise
comme suit :</p>
<example>
<highlight language="config">
LogFormat "%h %l %u %t \"%r\" %&gt;s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
CustomLog "log/access_log" combined
</highlight>
</example>
<p>Ce format est identique au Common Log Format, avec deux champs
supplémentaires. Chacun de ces deux champs utilise la directive
commençant par le caractère "%" <code>%{<em>header</em>}i</code>,
où <em>header</em> peut être n'importe quel en-tête de requête HTTP.
Avec ce format, le journal des accès se présentera comme suit :</p>
<example>
127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET
/apache_pb.gif HTTP/1.0" 200 2326
"http://www.example.com/start.html" "Mozilla/4.08 [en]
(Win98; I ;Nav)"
</example>
<p>Les champs supplémentaires sont :</p>
<dl>
<dt><code>"http://www.example.com/start.html"</code>
(<code>\"%{Referer}i\"</code>)</dt>
<dd>L'en-tête "Referer" (sic) de la requête HTTP. Il indique le site
depuis lequel le client prétend avoir lancé sa requête. (Ce doit être
la page qui contient un lien vers <code>/apache_pb.gif</code> ou
inclut ce dernier fichier).</dd>
<dt><code>"Mozilla/4.08 [en] (Win98; I ;Nav)"</code>
(<code>\"%{User-agent}i\"</code>)</dt>
<dd>L'en-tête User-Agent de la requête HTTP. C'est une information
d'identification que le navigateur du client envoie à propos
de lui-même.</dd>
</dl>
</section>
<section id="multiple">
<title>Journaux d'accès multiples</title>
<p>Plusieurs journaux d'accès peuvent être créés en spécifiant tout
simplement plusieurs directives
<directive module="mod_log_config">CustomLog</directive> dans le
fichier de configuration. Par exemple, les directives suivantes vont
créer trois journaux d'accès. Le premier contiendra les informations
de base CLF, le second les informations du Referer, et le troisième
les informations sur le navigateur. Les deux dernières directives
<directive module="mod_log_config">CustomLog</directive> montrent
comment simuler les effets des directives <code>ReferLog</code> et
<code>AgentLog</code>.</p>
<example>
<highlight language="config">
LogFormat "%h %l %u %t \"%r\" %&gt;s %b" common
CustomLog "logs/access_log" common
CustomLog "logs/referer_log" "%{Referer}i -&gt; %U"
CustomLog "logs/agent_log" "%{User-agent}i"
</highlight>
</example>
<p>Cet exemple montre aussi qu'il n'est pas obligatoire d'associer
une chaîne de format à un alias au moyen de la directive
<directive module="mod_log_config">LogFormat</directive>. Elle peut
être définie directement dans la ligne de la directive
<directive module="mod_log_config">CustomLog</directive>.</p>
</section>
<section id="conditional">
<title>Journalisation conditionnelle</title>
<p>Il est parfois souhaitable d'exclure certaines entrées des journaux
d'accès en fonction des caractéristiques de la requête du client. On
peut aisément accomplir ceci à l'aide des
<a href="env.html">variables d'environnement</a>. Tout d'abord, une
variable d'environnement doit être définie pour indiquer que la
requête remplit certaines conditions. Pour ceci, on utilise en général
la directive <directive module="mod_setenvif">SetEnvIf</directive>,
puis la clause <code>env=</code> de la directive
<directive module="mod_log_config">CustomLog</directive> pour inclure
ou exclure les requêtes pour lesquelles
la variable d'environnement est définie.
Quelques exemples :</p>
<example>
<highlight language="config">
# Marque les requêtes en provenance de l'interface loop-back
SetEnvIf Remote_Addr "127\.0\.0\.1" dontlog
# Marque les requêtes pour le fichier robots.txt
SetEnvIf Request_URI "^/robots\.txt$" dontlog
# Journalise toutes les autres requêtes
CustomLog "logs/access_log" common env=!dontlog
</highlight>
</example>
<p>Autre exemple, imaginons l'enregistrement des requêtes en provenance
d'utilisateurs de langue anglaise dans un journal, et celles des autres
utilisateurs dans un autre journal.</p>
<example>
<highlight language="config">
SetEnvIf Accept-Language "en" english
CustomLog "logs/english_log" common env=english
CustomLog "logs/non_english_log" common env=!english
</highlight>
</example>
<p>Dans le contexte d'une mise en cache, il peut être
intéressant de connaître l'efficacité du cache. Pour y parvenir,
on pourrait utiliser cette méthode simple :</p>
<example>
<highlight language="config">
SetEnv CACHE_MISS 1
LogFormat "%h %l %u %t "%r " %>s %b %{CACHE_MISS}e" common-cache
CustomLog "logs/access_log" common-cache
</highlight>
</example>
<p><module>mod_cache</module> va s'exécuter avant
<module>mod_env</module>, et si son action est couronnée de
succès, il délivrera le contenu sans faire appel à ce dernier. Si
l'URL se trouve dans le cache, la valeur journalisée sera alors
<code>-</code>, tandis que dans le cas contraire elle sera
<code>1</code>.</p>
<p>En plus de la syntaxe <code>env=</code>, la directive <directive
module="mod_log_config">LogFormat</directive> supporte les
valeurs de journalisation conditionnelles basées sur le code de la
réponse HTTP :</p>
<example>
<highlight language="config">
LogFormat "%400,501{User-agent}i" browserlog
LogFormat "%!200,304,302{Referer}i" refererlog
</highlight>
</example>
<p>Dans le premier exemple, le <code>User-agent</code> sera
enregistré si le code d'état HTTP est 400 ou 501. Dans le cas
contraire, c'est un caractère "-" qui sera enregistré à la place.
Dans le second exemple, le <code>Referer</code> sera enregistré si
le code d'état HTTP n'est <strong>pas</strong> 200, 304, ou 302
(remarquez le caractère "!" avant les codes d'état).</p>
<p>Bien que nous venions de montrer que la journalisation conditionnelle
est souple et très puissante, cette méthode de contrôle du contenu des
journaux n'est pas la seule. Les fichiers journaux sont plus utiles
quand ils contiennent un enregistrement complet de l'activité du serveur,
et il est souvent plus aisé de simplement traiter à posteriori les fichiers
journaux pour supprimer les requêtes que vous ne voulez pas y voir
apparaître.</p>
</section>
</section>
<section id="rotation">
<title>Rotation des journaux</title>
<p>Même sur un serveur modérément sollicité, les fichiers journaux
grossissent rapidement — le journal des accès croît à peu près de 1 Mo ou
plus toutes les 10000 requêtes. Sans rotation, les journaux consomment de
plus en plus d’espace disque et deviennent difficiles à analyser. Il est
donc recommandé de configurer une rotation automatique des journaux dès le
départ.</p>
<section id="rotation-rotatelogs">
<title>Utilisation de rotatelogs (recommandé)</title>
<p>L’approche la plus simple consiste à utiliser le programme
<program>rotatelogs</program> intégré à httpd en utilisant la <a
href="#piped">redirection des journaux</a>. Ce programme permet une
rotation des journaux sans avoir à redémarrer le serveur et sans outil
externe. Pour une rotation des journaux toutes les 24 heures :</p>
<example>
<highlight language="config">
CustomLog "|/usr/local/apache/bin/rotatelogs /var/log/httpd/access_log 86400" combined
ErrorLog "|/usr/local/apache/bin/rotatelogs /var/log/httpd/error_log 86400"
</highlight>
</example>
<p>Pour une rotation lorsque la taille du journal atteint une certaine
valeur (par exemple 100 Mo) :</p>
<example>
<highlight language="config">
CustomLog "|/usr/local/apache/bin/rotatelogs /var/log/httpd/access_log 100M" combined
</highlight>
</example>
<p>Vous pouvez aussi utiliser un motif de nom de fichier avec horodatage
sous forme d’une chaîne au format <code>strftime</code> :</p>
<example>
<highlight language="config">
CustomLog "|/usr/local/apache/bin/rotatelogs /var/log/httpd/access_log.%Y-%m-%d 86400" combined
</highlight>
</example>
<p>Voir <program>rotatelogs</program> pour une description complète de ses
options, en particulier les temps de décalage, les limitations de nombre de
fichiers et la compression.</p>
</section>
<section id="rotation-logrotate">
<title>Utilisation de logrotate ou de la gestion des journaux par le
système</title>
<p>La plupart des distributions de Linux fournissent le programme
<code>logrotate</code> qui effectue une rotation, une compression et une
expiration des fichiers journaux selon une planification. Si votre
distribution comporte déjà une configuration de logrotate pour httpd
(examinez <code>/etc/logrotate.d/</code>), elle gère peut-être déjà la
rotation pour vous.</p>
<p>Lorsqu’on utilise un outil de rotation externe comme
<code>logrotate</code>, il faut faire en sorte que httpd réouvre ses
fichiers journaux quand les anciens ont été mis de côté. Pour ce faire,
l’approche standard est un redémarrage <em>graceful</em> :</p>
<example>
<highlight language="sh">
/usr/sbin/apachectl graceful
</highlight>
</example>
<p>Votre script <code>postrotate</code> dans la configuration de logrotate
doit contenir cette dernière commande (ou la commande équivalente
<code>systemctl reload</code>). Comme httpd continue d’écrire dans
l’ancien fichier jusqu’à ce qu’il reçoive le signal, tout post-traitement
des fichiers ayant subi une rotation doit prévoir un bref délai.</p>
</section>
</section>
<section id="piped">
<title>Journaux redirigés</title>
<p>httpd peut écrire dans les fichiers journaux des erreurs et des accès à
travers un tube (pipe) vers un autre processus, plutôt que d’écrire
directement dans un fichier. Pour mettre en œuvre cette redirection,
remplacez le nom du fichier par le caractère pipe "<code>|</code>", suivi de
la commande qui recevra les entrées du journal sur son entrée standard :</p>
<example>
<highlight language="config">
CustomLog "|/usr/local/apache/bin/rotatelogs /var/log/httpd/access_log 86400" combined
</highlight>
</example>
<p>httpd démarre le processus de redirection des journaux au démarrage du
serveur et le redémarre automatiquement s’il se plante (ce comportement est
parfois nommé « journalisation redirigée fiable »). L’ensemble de la
commande à partir du caractère pipe doit être entourée de guillemets — cette
syntaxe fonctionne pour les deux directives <directive
module="mod_log_config">CustomLog</directive> et <directive
module="core">ErrorLog</directive>.</p>
<p>Les processus de redirection des journaux sont lancés par le processus
httpd parent et héritent de son identifiant utilisateur. Cela signifie en
général qu’ils s’exécutent en tant que root ; faites donc en sorte que les
programmes de redirection des journaux restent simples et sécurisés.</p>
<p>Par défaut, le processus de redirection des journaux est lancé
directement, sans passer par un shell. Vous pouvez utiliser
"<code>|$</code>" à la place de "<code>|</code>" pour effectuer ce lancement
via un shell (en général <code>/bin/sh -c</code>) :</p>
<example>
<highlight language="config">
CustomLog "|$/usr/local/apache/bin/rotatelogs /var/log/httpd/access_log 86400" combined
</highlight>
</example>
<p>La variante avec shell est parfois requise si votre commande redirigée
utilise des fonctionnalités du shell comme les caractères génériques ou le
développement de variable. Dans la plupart des cas, il est préférable
d’utiliser l’invocation directe (sans passer par un shell).</p>
<note><title>Note à propos de la plateforme Windows</title>
<p>Notez que sous Windows, la mémoire allouée au bureau (desktop
heap) peut devenir insuffisante si vous utilisez de nombreux
processus vers lesquels sont redirigés des journaux via un pipe, et
ceci particulièrement si httpd s'exécute en tant que service. La
quantité de mémoire du bureau allouée à chaque service est spécifiée
dans le troisième argument du paramètre <code>SharedSection</code>
de la clé de registre
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SessionManager\SubSystems\Windows.
<strong>Modifiez cette valeur avec prudence</strong> ; les
précautions d'usage s'imposent lorsqu'on modifie la base de registre,
mais vous pouvez aussi saturer la mémoire du bureau si vous
spécifiez une valeur trop élevée.</p>
</note>
</section>
<section id="virtualhost">
<title>Hôtes virtuels</title>
<p>Lorsqu'un serveur possède plusieurs <a href
="vhosts/">hôtes virtuels</a>, il existe de nombreuses solutions pour gérer
les fichiers journaux. Par exemple, on peut utiliser les journaux comme
s'il s'agissait d'un serveur avec un seul hôte. Il suffit pour cela de
placer les directives de journalisation en dehors des sections
<directive module="core" type="section">VirtualHost</directive> au niveau
du serveur principal, ce qui a pour effet de journaliser toutes les
requêtes dans le même journal des accès et des erreurs. Cette technique
est cependant inappropriée pour recueillir des statistiques sur chaque
hôte virtuel individuellement.</p>
<p>Si des directives <directive module=
"mod_log_config">CustomLog</directive> ou
<directive module="core">ErrorLog</directive> sont placées dans une section
<directive module="core" type="section">VirtualHost</directive>, toutes les
requêtes ou erreurs pour cet hôte virtuel ne seront enregistrées que dans
le fichier spécifié. Tout hôte virtuel qui ne possède pas de directives de
journalisation verra ses requêtes enregistrées dans le journal du serveur
principal. Cette technique est appropriée pour un petit nombre d'hôtes
virtuels, mais si ce nombre est important, elle peut devenir compliquée à
gérer. En outre, des problèmes de <a
href="vhosts/fd-limits.html">nombre de descripteurs
de fichiers insuffisant</a> peuvent rapidement apparaître.</p>
<p>Il existe un très bon compromis pour le journal des accès. En intégrant
les informations à propos de l'hôte virtuel à la chaîne de format du
journal, il est possible de journaliser tous les hôtes dans le même
journal, puis de séparer ultérieurement le journal en plusieurs journaux
individuels. Considérons par exemple les directives suivantes :</p>
<example>
<highlight language="config">
LogFormat "%v %p %h %l %u %t \"%r\" %&gt;s %b" commonvhost
CustomLog "logs/access_log" commonvhost
</highlight>
</example>
<p>Le champ <code>%v</code> sert à enregistrer le nom de l'hôte virtuel qui
traite la requête. Un programme tel que <a
href="programs/split-logfile.html">split-logfile</a> peut ensuite être utilisé
pour générer "à froid" autant de journaux que d'hôtes virtuels.</p>
</section>
<section id="other">
<title>Autres fichiers journaux</title>
<related>
<modulelist>
<module>mod_logio</module>
<module>mod_log_config</module>
<module>mod_log_debug</module>
<module>mod_log_forensic</module>
<module>mod_cgi</module>
</modulelist>
<directivelist>
<directive module="mod_log_config">BufferedLogs</directive>
<directive module="mod_log_forensic">ForensicLog</directive>
<directive module="mod_log_config">LogFormat</directive>
<directive module="mod_log_debug">LogMessage</directive>
<directive module="mpm_common">PidFile</directive>
<directive module="mod_cgi">ScriptLog</directive>
<directive module="mod_cgi">ScriptLogBuffer</directive>
<directive module="mod_cgi">ScriptLogLength</directive>
</directivelist>
</related>
<section>
<title>Enregistrement du nombre réel d'octets envoyés et reçus</title>
<p>Le module <module>mod_logio</module> fournit deux champs
<directive module="mod_log_config">LogFormat</directive> supplémentaires
(%I et %O) qui permettent d'enregistrer le nombre réel d'octets reçus et
envoyés sur le réseau.</p>
</section>
<section>
<title>Journalisation de style investigation judiciaire (forensic logging)</title>
<p>Le module <module>mod_log_forensic</module> permet la journalisation
à des fins d'investigation judiciaire des requêtes des clients. La
journalisation est effectuée avant et après le traitement de la requête,
qui fait donc l'objet de deux entrées dans le journal. Le générateur de
journaux d'investigation est très strict et ne permet aucune
personnalisation. C'est un inestimable outil de débogage et de sécurité.</p>
</section>
<section id="pidfile">
<title>Fichier PID</title>
<p>Au démarrage, le démon httpd Apache enregistre l'identifiant du
processus httpd parent dans le fichier <code>logs/httpd.pid</code>.
Le nom de ce fichier peut être modifié à l'aide de la directive
<directive module="mpm_common">PidFile</directive>. Cet identifiant
permet à l'administrateur de redémarrer et arrêter le démon en
envoyant des signaux au processus parent ; sous Windows, vous devez
utiliser l'option de ligne de commande -k. Pour plus de détails,
consulter la page <a href="stopping.html">Arrêt et redémarrage</a>.</p>
</section>
<section id="scriptlog">
<title>Journal des scripts</title>
<p>Afin de faciliter le débogage, la directive
<directive module="mod_cgi">ScriptLog</directive> vous permet
d'enregistrer les entrées et sorties des scripts CGI. Elle ne doit être
utilisée que pendant la phase de test, et en aucun cas sur un
serveur en production. Vous trouverez plus d'informations dans la
documentation du module <a href="mod/mod_cgi.html">mod_cgi</a>.</p>
</section>
<section id="debug">
<title>Journalisation de débogage configurable</title>
<p>La directive <directive module="mod_log_debug">LogMessage</directive>
vous permet de créer vos propres messages de journalisation
personnalisés pour faciliter vos opérations de débogage.
</p>
</section>
</section>
</manualpage>