]> granicus.if.org Git - apache/blob - docs/manual/logs.xml.fr
Axe some outdated references to httpd 1.2.x and 2.0.x.
[apache] / docs / manual / logs.xml.fr
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE manualpage SYSTEM "./style/manualpage.dtd">
3 <?xml-stylesheet type="text/xsl" href="./style/manual.fr.xsl"?>
4 <!-- French translation : Lucien GENTIS -->
5 <!-- Reviewed by : Vincent Deffontaines -->
6 <!-- English Revision: 1741842 -->
7
8 <!--
9  Licensed to the Apache Software Foundation (ASF) under one or more
10  contributor license agreements.  See the NOTICE file distributed with
11  this work for additional information regarding copyright ownership.
12  The ASF licenses this file to You under the Apache License, Version 2.0
13  (the "License"); you may not use this file except in compliance with
14  the License.  You may obtain a copy of the License at
15
16      http://www.apache.org/licenses/LICENSE-2.0
17
18  Unless required by applicable law or agreed to in writing, software
19  distributed under the License is distributed on an "AS IS" BASIS,
20  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21  See the License for the specific language governing permissions and
22  limitations under the License.
23 -->
24
25 <manualpage metafile="logs.xml.meta">
26
27   <title>Fichiers journaux</title>
28
29   <summary>
30     <p>Pour véritablement gérer un serveur web,
31     il est nécessaire de disposer d'un
32     retour d'informations à propos de l'activité et des performances du
33     serveur, ainsi que de tout problème qui pourrait survenir. Le serveur HTTP
34     Apache propose des fonctionnalités de journalisation souples et très
35     complètes. Ce document décrit comment configurer ces fonctionnalités de
36     journalisation et interpréter le contenu des journaux.</p>
37   </summary>
38
39   <section id="overview">
40     <title>Vue d'ensemble</title>
41
42   <related>
43       <modulelist>
44         <module>mod_log_config</module>
45         <module>mod_log_forensic</module>
46         <module>mod_logio</module>
47         <module>mod_cgi</module>
48       </modulelist>
49   </related>
50
51   <p>
52   Le serveur HTTP Apache fournit toute une variété de mécanismes
53   différents pour la journalisation de tout ce qui peut se passer au
54   sein de votre serveur, depuis la requête initiale, en passant par le
55   processus de mise en correspondance des URLs, et jusqu'à la fermeture
56   de la connexion, y compris toute erreur pouvant survenir au cours du
57   traitement. De plus, certains modules tiers fournissent des
58   fonctionnalités de journalisation ou insèrent des entrées dans les
59   fichiers journaux existants, et les applications comme les programmes
60   CGI, les scripts PHP ou autres gestionnaires peuvent envoyer des
61   messages vers le journal des erreurs du serveur.
62   </p>
63
64   <p>
65   Ce document décrit le fonctionnement des modules de journalisation
66   fournis en standard avec le serveur httpd.
67   </p>
68
69   </section>
70
71   <section id="security">
72     <title>Avertissement à propos de la sécurité</title>
73
74     <p>Tout utilisateur qui a les droits en écriture sur le répertoire dans
75     lequel Apache httpd écrit ses journaux pourra quasi
76     certainement avoir accès à l'uid sous lequel le serveur est démarré, en
77     l'occurrence habituellement root. N'accordez <em>PAS</em> aux utilisateurs
78     l'accès en écriture au répertoire dans lequel les journaux sont stockés
79     sans savoir exactement quelles en seraient les conséquences ; voir le
80     document <a href="misc/security_tips.html">conseils sur la sécurité</a>
81     pour plus de détails.</p>
82
83     <p>En outre, les journaux peuvent contenir des informations fournies
84     directement par un client, sans caractères d'échappement. Des clients mal
85     intentionnés peuvent donc insérer des caractères de contrôle dans les
86     journaux, et il convient par conséquent d'être très prudent lors de la
87     manipulation des journaux bruts.</p>
88   </section>
89
90   <section id="errorlog">
91     <title>Journal des erreurs</title>
92
93     <related>
94       <modulelist>
95         <module>core</module>
96       </modulelist>
97       <directivelist>
98         <directive module="core">ErrorLog</directive>
99         <directive module="core">LogLevel</directive>
100       </directivelist>
101     </related>
102
103     <p>Le journal des erreurs du serveur, dont le nom et la localisation sont
104     définis par la directive <directive module="core">ErrorLog</directive>,
105     est le journal le plus important. C'est dans celui-ci
106     que le démon Apache httpd va envoyer les informations de diagnostic et
107     enregistrer toutes les erreurs qui surviennent lors du traitement des
108     requêtes. Lorsqu'un problème survient au démarrage du serveur ou pendant
109     son fonctionnement, la première chose à faire est de regarder dans ce
110     journal, car il vous renseignera souvent sur le problème rencontré et
111     la manière d'y remédier.</p>
112
113     <p>Le journal des erreurs est habituellement enregistré dans un fichier
114     (en général <code>error_log</code> sur les systèmes de type Unix et
115     <code>error.log</code> sur Windows et OS/2). Sur les systèmes de type Unix,
116     le serveur peut aussi enregistrer ses erreurs dans
117     <code>syslog</code> ou les
118     <a href="#piped">rediriger vers un programme</a> par l'intermédiaire d'un
119     tube de communication (pipe).</p>
120
121     <p>Le format par défaut du journal des erreurs est descriptif et de forme
122     relativement libre. Certaines informations apparaissent cependant dans la
123     plupart des entrées du journal. Voici un message typique
124     à titre d'exemple : </p>
125
126     <example>
127       [Wed Oct 11 14:32:52 2000] [error] [client 127.0.0.1]
128       client denied by server configuration:
129       /export/home/live/ap/htdocs/test
130     </example>
131
132     <p>Le premier champ de l'entrée du journal est la date et l'heure du
133     message. Le second champ indique la sévérité de l'erreur rapportée. La
134     directive <directive module="core">LogLevel</directive> permet de
135     restreindre le type des erreurs qui doivent être enregistrées
136     dans le journal des erreurs en définissant leur niveau de sévérité. Le
137     troisième champ contient l'adresse IP du client qui a généré l'erreur.
138     Vient ensuite le message proprement dit, qui indique dans ce cas que le
139     serveur a été configuré pour interdire l'accès au client. Le serveur
140     indique le chemin système du document requis (et non
141     son chemin web).</p>
142
143     <p>Une grande variété de messages différents peuvent apparaître dans le
144     journal des erreurs. La plupart d'entre eux sont similaires à l'exemple
145     ci-dessus. Le journal des erreurs peut aussi contenir des informations de
146     débogage en provenance de scripts CGI. Toute information qu'un script CGI
147     écrit sur la sortie d'erreurs standard <code>stderr</code> sera recopiée
148     telle quelle dans le journal des erreurs.</p>
149
150     <p>La directive <directive module="core">ErrorLogFormat</directive>
151     vous permet de personnaliser le format du journal des erreurs, et de
152     définir les informations à journaliser. Si
153     <module>mod_unique_id</module> est présent, vous pouvez utiliser le
154     drapeau <code>%L</code> à la fois dans le journal des erreurs et
155     dans le
156     journal des accès, ce qui aura pour effet de générer un identifiant
157     d'entrée qui vous permettra de corréler les entrées du journal des
158     erreurs avec celles du journal des accès.</p>
159
160     <p>Pendant la phase de test, il est souvent utile de visualiser en continu
161     le journal des erreurs afin de détecter tout problème éventuel. Sur les
162     systèmes de type Unix, ceci s'effectue à l'aide de la commande :</p>
163
164     <example>
165       tail -f error_log
166     </example>
167   </section>
168
169   <section id="permodule">
170     <title>Journalisation par module</title>
171
172     <p>La directive <directive module="core">LogLevel</directive> permet
173     de spécifier un niveau de sévérité de journalisation pour chaque
174     module. Vous pouvez ainsi résoudre un problème propre à un module particulier
175     en augmentant son volume de journalisation sans augmenter ce volume
176     pour les autres modules. Ceci est particulièrement utile lorsque
177     vous voulez obtenir des détails sur le fonctionnement de modules
178     comme <module>mod_proxy</module> ou <module>mod_rewrite</module>.</p>
179
180     <p>Pour ce faire, vous devez spécifier le nom du module dans votre
181     directive <directive>LogLevel</directive> :</p>
182
183     <highlight language="config">
184     LogLevel info rewrite:trace5
185     </highlight>
186
187     <p>Dans cet exemple, le niveau de journalisation général est défini
188     à info, et à <code>trace5</code> pour <module>mod_rewrite</module>.</p>
189
190     <note>Cette directive remplace les directives de journalisation par
191     module des versions précédentes du serveur, comme
192     <code>RewriteLog</code>.</note>
193  </section>
194
195
196   <section id="accesslog">
197     <title>Journal des accès</title>
198
199     <related>
200       <modulelist>
201         <module>mod_log_config</module>
202         <module>mod_setenvif</module>
203       </modulelist>
204       <directivelist>
205         <directive module="mod_log_config">CustomLog</directive>
206         <directive module="mod_log_config">LogFormat</directive>
207         <directive module="mod_setenvif">SetEnvIf</directive>
208       </directivelist>
209     </related>
210
211     <p>Le journal des accès au serveur
212     enregistre toutes les requêtes que traite
213     ce dernier. La localisation et le contenu du journal des accès sont définis
214     par la directive <directive module="mod_log_config">CustomLog</directive>.
215     La directive <directive module="mod_log_config">LogFormat</directive>
216     permet de simplifier la sélection du contenu du journal. Cette section
217     décrit comment configurer le serveur pour l'enregistrement des informations
218     dans le journal des accès.</p>
219
220     <p>Bien évidemment, le stockage d'informations dans le journal des accès
221     n'est que le point de départ de la gestion de la journalisation. L'étape
222     suivante consiste à analyser ces informations de façon à pouvoir en
223     extraire des statistiques utiles. L'analyse de journaux en général est en
224     dehors du sujet de ce document et ne fait pas vraiment partie intégrante
225     du travail du serveur web lui-même. Pour plus d'informations à propos de ce
226     sujet et des applications dédiées à l'analyse de journaux, vous pouvez vous
227     référer à <a href="http://dmoz.org/Computers/Software/Internet/
228     Site_Management/Log_analysis/">Open Directory</a>.
229     </p>
230
231     <p>Différentes versions du démon Apache httpd utilisaient d'autres modules
232     et directives pour contrôler la journalisation des accès, à l'instar de
233     mod_log_referer, mod_log_agent, et de la directive
234     <code>TransferLog</code>. La directive
235     <directive  module="mod_log_config">CustomLog</directive> rassemble
236     désormais les fonctionnalités de toutes les anciennes directives.</p>
237
238     <p>Le format du journal des accès est hautement configurable. Il est
239     défini à l'aide d'une chaîne de format qui ressemble sensiblement à la
240     chaîne de format de style langage C de printf(1). Vous trouverez quelques
241     exemples dans les sections suivantes. Pour une liste exhaustive de ce que
242     peut contenir une chaîne de format, vous pouvez vous référer au chapitre
243     <a href="mod/mod_log_config.html#formats">chaînes de format</a> de la
244     documentation du module <module>mod_log_config</module>.</p>
245
246     <section id="common">
247       <title>Format habituel du journal</title>
248
249       <p>Voici une configuration typique pour le journal des accès :</p>
250
251       <highlight language="config">
252 LogFormat "%h %l %u %t \"%r\" %&gt;s %b" common
253 CustomLog "logs/access_log" common
254       </highlight>
255
256       <p>Ici est définie l'<em>identité</em> <code>common</code> qui est
257       ensuite associée à une chaîne de format de journalisation particulière.
258       La chaîne de format est constituée de directives débutant par le
259       caractère %, chacune d'entre elles indiquant au serveur d'enregistrer
260       un élément particulier d'information. Des caractères littéraux peuvent
261       aussi être insérés dans la chaîne de format ; il seront copiés tels
262       quels dans le flux de sortie destiné à la journalisation.
263       Les guillemets (<code>"</code>) doivent être échappées en les faisant
264       précéder d'un anti-slash (<code>\</code>) afin qu'elles ne soient pas
265       interprétées comme la fin de la chaîne de format. La chaîne de format
266       peut aussi contenir les caractères de contrôle spéciaux
267       "<code>\n</code>" et "<code>\t</code>" pour insérer respectivement
268       un passage à la ligne et une tabulation.</p>
269
270       <p>La directive <directive module="mod_log_config">CustomLog</directive>
271       définit un nouveau fichier journal en l'associant à l'identité
272       précédemment définie. Le chemin du nom de fichier associé au journal
273       des accès est relatif au chemin défini par la directive
274       <directive module="core">ServerRoot</directive>, sauf s'il
275       débute par un slash.</p>
276
277       <p>La configuration ci-dessus va enregistrer les entrées de
278       journalisation selon un format connu sous le nom de
279       Common Log Format (CLF) pour "Format de journalisation standard".
280       Ce format standard peut être produit par de nombreux serveurs web
281       différents et lu par de nombreux programmes d'analyse de journaux.
282       Les entrées de fichier journal générées selon le format CLF
283       ressemblent à ceci :</p>
284
285       <example>
286         127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET
287         /apache_pb.gif HTTP/1.0" 200 2326
288       </example>
289
290       <p>Chaque partie de cette entrée de journal est décrite
291       dans ce qui suit.</p>
292
293       <dl>
294         <dt><code>127.0.0.1</code> (<code>%h</code>)</dt>
295
296         <dd>Il s'agit de l'adresse IP du client (l'hôte distant) qui a envoyé
297         la requête au serveur. Si la directive
298         <directive module="core">HostnameLookups</directive> est positionnée à
299         <code>On</code>, le serveur va essayer de déterminer le nom de l'hôte
300         et de l'enregistrer à la place de l'adresse IP. Cette configuration
301         n'est cependant pas recommandée car elle peut ralentir le serveur de
302         manière significative. Il est par conséquent préférable d'utiliser un
303         processeur d'analyse de journaux a posteriori
304         tel que <program>logresolve</program>
305         pour déterminer les noms d'hôte. L'adresse IP indiquée ici n'est pas
306         nécessairement l'adresse IP de la machine devant laquelle se trouve
307         l'utilisateur. Si un serveur mandataire s'intercale entre le serveur
308         et l'utilisateur, l'adresse indiquée sera celle du mandataire et non
309         celle de la machine à l'origine de la requête.</dd>
310
311         <dt><code>-</code> (<code>%l</code>)</dt>
312
313         <dd>Le "trait d'union" indique que la portion d'information
314         correspondante n'est pas disponible. Dans le cas présent, l'information
315         non disponible est l'identité (RFC 1413) du client telle que déterminée
316         par <code>identd</code> sur la machine cliente. Cette information est
317         très peu fiable et ne devrait jamais être utilisée, sauf dans le cas
318         de réseaux internes étroitement contrôlés. Le démon httpd ne cherchera
319         d'ailleurs à obtenir cette information que si la directive
320         <directive module="mod_ident">IdentityCheck</directive> est positionnée
321         à <code>On</code>.</dd>
322
323         <dt><code>frank</code> (<code>%u</code>)</dt>
324
325         <dd>Il s'agit de l'identifiant utilisateur de la personne qui a
326         demandé le document, issu d'une authentification HTTP.
327         Ce même identifiant est en général fourni aux scripts CGI par
328         l'intermédiaire de la valeur de la variable d'environnement
329         <code>REMOTE_USER</code>. Si le statut de la requête (voir plus loin)
330         est 401, cette identifiant n'est pas fiable car l'utilisateur n'est
331         pas encore authentifié. Si le document n'est pas protégé par
332         mot de passe, cette partie d'information sera représentée par
333         "<code>-</code>", comme la partie précédente.</dd>
334
335         <dt><code>[10/Oct/2000:13:55:36 -0700]</code>
336         (<code>%t</code>)</dt>
337
338         <dd>
339           L'heure à laquelle la requête a été reçue.
340           Le format est le suivant :
341
342           <p class="indent">
343             <code>[jour/mois/année:heure:minutes:secondes zone]<br />
344              jour = 2*chiffre<br />
345              mois = 3*lettre<br />
346              année = 4*chiffre<br />
347              heure = 2*chiffre<br />
348              minutes = 2*chiffre<br />
349              secondes = 2*chiffre<br />
350              zone = (`+' | `-') 4*chiffre</code>
351           </p>Il est possible de modifier le format d'affichage de l'heure
352           en spécifiant <code>%{format}t</code> dans la chaîne de format du
353           journal, où <code>format</code> est une chaîne de format
354           de la forme de celle de la fonction <code>strftime(3)</code>
355           de la bibliothèque C standard, ou choisie parmi les
356           formats spéciaux supportés. Pour plus de détails,
357           reportez-vous aux. <a
358           href="mod/mod_log_config.html#formats">chaînes de format</a>
359           de <module>mod_log_config</module>.
360         </dd>
361
362         <dt><code>"GET /apache_pb.gif HTTP/1.0"</code>
363         (<code>\"%r\"</code>)</dt>
364
365         <dd>La ligne de la requête du client est placée entre guillemets.
366         Elle contient de nombreuses informations utiles. Tout d'abord, la
367         méthode utilisée par le client est <code>GET</code>. Ensuite, le
368         client a demandé la ressource <code>/apache_pb.gif</code>, et enfin,
369         le client a utilisé le protocole <code>HTTP/1.0</code>. Il est aussi
370         possible d'enregistrer séparément une ou plusieurs parties de la
371         requête. Par exemple, la chaîne de format "<code>%m %U %q %H</code>"
372         va enregistrer la méthode, le chemin, la chaîne de la requête et le
373         protocole, ce qui donnera le même résultat que
374         "<code>%r</code>".</dd>
375
376         <dt><code>200</code> (<code>%&gt;s</code>)</dt>
377
378         <dd>C'est le code de statut que le serveur retourne au client. Cette
379         information est très importante car elle indique si la requête a fait
380         l'objet d'une réponse positive (codes commençant par 2), une
381         redirection (codes commençant par 3), une erreur due au client (codes
382         commençant par 4), ou une erreur due au serveur (codes commençant
383         par 5). Vous trouverez la liste complète des codes de statut possibles
384         dans la <a href="http://www.w3.org/Protocols/rfc2616/
385         rfc2616.txt">specification HTTP</a> (RFC2616 section 10).</dd>
386
387         <dt><code>2326</code> (<code>%b</code>)</dt>
388
389         <dd>La dernière partie indique la taille de l'objet retourné au client,
390         en-têtes non compris. Si aucun contenu n'a été retourné au client, cette
391         partie contiendra "<code>-</code>". Pour indiquer l'absence de contenu
392         par "<code>0</code>", utilisez <code>%B</code> au lieu de
393         <code>%b</code>.</dd>
394       </dl>
395     </section>
396
397     <section id="combined">
398       <title>Combined Log Format (Format de journalisation combiné)</title>
399
400       <p>Une autre chaîne de format couramment utilisée est le
401       "Combined Log Format" (Format de journalisation combiné). Il s'utilise
402       comme suit :</p>
403
404       <highlight language="config">
405 LogFormat "%h %l %u %t \"%r\" %&gt;s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
406 CustomLog "log/access_log" combined
407       </highlight>
408
409       <p>Ce format est identique au Common Log Format, avec deux champs
410       supplémentaires. Chacun de ces deux champs utilise la directive
411       commençant par le caractère "%" <code>%{<em>header</em>}i</code>,
412       où <em>header</em> peut être n'importe quel en-tête de requête HTTP.
413       Avec ce format, le journal des accès se présentera comme suit :</p>
414
415       <example>
416         127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET
417         /apache_pb.gif HTTP/1.0" 200 2326
418         "http://www.example.com/start.html" "Mozilla/4.08 [en]
419         (Win98; I ;Nav)"
420       </example>
421
422       <p>Les champs supplémentaires sont :</p>
423
424       <dl>
425         <dt><code>"http://www.example.com/start.html"</code>
426         (<code>\"%{Referer}i\"</code>)</dt>
427
428         <dd>L'en-tête "Referer" (sic) de la requête HTTP. Il indique le site
429         depuis lequel le client prétend avoir lancé sa requête. (Ce doit être
430         la page qui contient un lien vers <code>/apache_pb.gif</code> ou
431         inclut ce dernier fichier).</dd>
432
433         <dt><code>"Mozilla/4.08 [en] (Win98; I ;Nav)"</code>
434         (<code>\"%{User-agent}i\"</code>)</dt>
435
436         <dd>L'en-tête User-Agent de la requête HTTP. C'est une information
437         d'identification que le navigateur du client envoie à propos
438         de lui-même.</dd>
439       </dl>
440     </section>
441
442     <section id="multiple">
443       <title>Journaux d'accès multiples</title>
444
445       <p>Plusieurs journaux d'accès peuvent être créés en spécifiant tout
446       simplement plusieurs directives
447       <directive module="mod_log_config">CustomLog</directive> dans le
448       fichier de configuration. Par exemple, les directives suivantes vont
449       créer trois journaux d'accès. Le premier contiendra les informations
450       de base CLF, le second les informations du Referer, et le troisième
451       les informations sur le navigateur. Les deux dernières directives
452       <directive module="mod_log_config">CustomLog</directive> montrent
453       comment simuler les effets des directives <code>ReferLog</code> et
454       <code>AgentLog</code>.</p>
455
456       <highlight language="config">
457 LogFormat "%h %l %u %t \"%r\" %&gt;s %b" common
458 CustomLog "logs/access_log" common
459 CustomLog "logs/referer_log" "%{Referer}i -&gt; %U"
460 CustomLog "logs/agent_log" "%{User-agent}i"
461       </highlight>
462
463       <p>Cet exemple montre aussi qu'il n'est pas obligatoire d'associer
464       une chaîne de format à un alias au moyen de la directive
465       <directive module="mod_log_config">LogFormat</directive>. Elle peut
466       être définie directement dans la ligne de la directive
467       <directive module="mod_log_config">CustomLog</directive>.</p>
468     </section>
469
470     <section id="conditional">
471       <title>Journalisation conditionnelle</title>
472
473       <p>Il est parfois souhaitable d'exclure certaines entrées des journaux
474       d'accès en fonction des caractéristiques de la requête du client. On
475       peut aisément accomplir ceci à l'aide des
476       <a href="env.html">variables d'environnement</a>. Tout d'abord, une
477       variable d'environnement doit être définie pour indiquer que la
478       requête remplit certaines conditions. Pour ceci, on utilise en général
479       la directive <directive module="mod_setenvif">SetEnvIf</directive>,
480       puis la clause <code>env=</code> de la directive
481       <directive module="mod_log_config">CustomLog</directive> pour inclure
482       ou exclure les requêtes pour lesquelles
483       la variable d'environnement est définie.
484       Quelques exemples :</p>
485
486       <highlight language="config">
487 # Marque les requêtes en provenance de l'interface loop-back
488 SetEnvIf Remote_Addr "127\.0\.0\.1" dontlog
489 # Marque les requêtes pour le fichier robots.txt
490 SetEnvIf Request_URI "^/robots\.txt$" dontlog
491 # Journalise toutes les autres requêtes
492 CustomLog "logs/access_log" common env=!dontlog
493       </highlight>
494
495       <p>Autre exemple, imaginons l'enregistrement des requêtes en provenance
496       d'utilisateurs de langue anglaise dans un journal, et celles des autres
497       utilisateurs dans un autre journal.</p>
498
499       <highlight language="config">
500         SetEnvIf Accept-Language "en" english
501         CustomLog "logs/english_log" common env=english
502         CustomLog "logs/non_english_log" common env=!english
503       </highlight>
504
505         <p>Dans le contexte d'une mise en cache, il peut être
506         intéressant de connaître l'efficacité du cache. Pour y parvenir,
507         on pourrait utiliser cette méthode simple :</p>
508
509       <highlight language="config">
510 SetEnv CACHE_MISS 1
511 LogFormat "%h %l %u %t "%r " %>s %b %{CACHE_MISS}e" common-cache
512 CustomLog "logs/access_log" common-cache
513       </highlight>
514
515       <p><module>mod_cache</module> va s'exécuter avant
516       <module>mod_env</module>, et si son action est couronnée de
517       succès, il délivrera le contenu sans faire appel à ce dernier. Si
518       l'URL se trouve dans le cache, la valeur journalisée sera alors
519       <code>-</code>, tandis que dans le cas contraire elle sera
520       <code>1</code>.</p>
521
522       <p>En plus de la syntaxe <code>env=</code>, la directive <directive
523       module="mod_log_config">LogFormat</directive> supporte les
524       valeurs de journalisation conditionnelles basées sur le code de la
525       réponse HTTP :</p>
526
527       <highlight language="config">
528 LogFormat "%400,501{User-agent}i" browserlog
529 LogFormat "%!200,304,302{Referer}i" refererlog
530       </highlight>
531
532       <p>Dans le premier exemple, le <code>User-agent</code> sera
533       enregistré si le code d'état HTTP est 400 ou 501. Dans le cas
534       contraire, c'est un caractère "-" qui sera enregistré à la place.
535       Dans le second exemple, le <code>Referer</code> sera enregistré si
536       le code d'état HTTP n'est <strong>pas</strong> 200, 204, ou 302
537       (remarquez le caractère "!" avant les codes d'état).</p>
538
539       <p>Bien que nous venions de montrer que la journalisation conditionnelle
540       est souple et très puissante, cette méthode de contrôle du contenu des
541       journaux n'est pas la seule. Les fichiers journaux sont plus utiles
542       quand ils contiennent un enregistrement complet de l'activité du serveur,
543       et il est souvent plus aisé de simplement traiter à posteriori les fichiers
544       journaux pour supprimer les requêtes que vous ne voulez pas y voir
545       apparaître.</p>
546     </section>
547   </section>
548
549   <section id="rotation">
550     <title>Rotation des journaux</title>
551
552     <p>Même dans le cas d'un serveur modérément sollicité, la quantité
553     d'informations stockées dans les fichiers journaux est très importante.
554     Le fichier journal des accès grossit en général d'1 Mo ou plus toutes
555     les 10000 requêtes. Il est par conséquent nécessaire d'effectuer
556     périodiquement la rotation des journaux en déplaçant ou supprimant les
557     fichiers correspondants. On ne peut pas le faire pendant que le serveur
558     est en cours d'exécution, car Apache httpd va continuer à écrire dans l'ancien
559     fichier journal aussi longtemps qu'il le maintiendra ouvert.
560     C'est pourquoi le serveur doit être
561     <a href="stopping.html">redémarré</a> après le déplacement ou la
562     suppression des fichiers journaux de façon à ce qu'il en ouvre
563     de nouveaux.</p>
564
565     <p>Avec un redémarrage <em>graceful</em>, on peut faire en sorte que le
566     serveur ouvre de nouveaux fichiers journaux sans perdre de connexions
567     existantes ou en cours avec les clients. Cependant, pour que ceci soit
568     possible, le serveur doit continuer à écrire dans les anciens fichiers
569     journaux pendant qu'il termine le traitement des requêtes en cours.
570     Il est donc nécessaire d'attendre un certain temps après le rédémarrage
571     avant d'effectuer tout traitement sur les fichiers journaux. Voici un
572     scénario typique dans lequel on effectue une simple rotation des
573     journaux en compressant les anciens fichiers correspondants afin
574     de gagner de l'espace disque :</p>
575
576     <example>
577       mv access_log access_log.old<br />
578       mv error_log error_log.old<br />
579       apachectl graceful<br />
580       sleep 600<br />
581       gzip access_log.old error_log.old
582     </example>
583
584     <p>La section suivante présente une autre méthode de rotation des journaux
585     qui consiste à utiliser les
586     <a href="#piped">journaux redirigés</a>.</p>
587   </section>
588
589   <section id="piped">
590     <title>Journaux redirigés</title>
591
592     <p>Nous avons vu que le démon httpd écrivait les informations de
593     journalisation des erreurs et des accès dans un fichier journal ;
594     il peut aussi
595     rediriger ces informations vers un autre processus par l'intermédiaire d'un
596     tube de communication (pipe). Cette fonctionnalité améliore
597     considérablement la souplesse de la journalisation, sans ajouter de code
598     au serveur principal. Pour rediriger les informations de journalisation
599     vers un tube de communication, remplacez simplement le nom de fichier
600     journal par
601     le caractère pipe "<code>|</code>", suivi du nom de l'exécutable qui va
602     recueillir les entrées de journal sur son entrée
603     standard. Le serveur va
604     lancer le processus de redirection des journaux au moment du démarrage du
605     serveur, et le relancera s'il cesse de fonctionner
606     pendant l'exécution du serveur.
607     (Nous dénommons cette technique "journalisation
608     redirigée fiable" grâce à cette dernière fonctionnalité.)</p>
609
610     <p>Les processus de journalisation redirigée sont lancés par le processus
611     httpd parent, et héritent de l'UID de ce dernier. Cela signifie que les
612     programmes de journalisation dirigée s'exécutent généralement en tant que
613     root. Il est donc très important que ces programmes soient simples et
614     sécurisés.</p>
615
616     <p>Un des grands avantages de la journalisation redirigée est la possibilité
617     d'effectuer la rotation des journaux sans avoir à redémarrer le serveur. Pour
618     accomplir cette tâche, le serveur HTTP Apache fournit un programme simple
619     appelé <program>rotatelogs</program>. Par exemple, pour une rotation des
620     journaux toutes les 24 heures, ajoutez ces lignes :</p>
621
622     <highlight language="config">
623       CustomLog "|/usr/local/apache/bin/rotatelogs /var/log/access_log 86400" common
624     </highlight>
625
626     <p>Notez que l'ensemble de la commande qui sera appelée par le tube de
627     communication a été placée entre guillemets. Bien que cet exemple
628     concerne le journal des accès, la même technique peut être utilisée
629     pour le journal des erreurs.</p>
630
631     <p>Comme la journalisation conditionnelle, la journalisation redirigée est
632     un outil très puissant, mais si elle existe, il est préférable d'utiliser
633     une solution plus simple comme le traitement à posteriori hors ligne.</p>
634
635
636   <p>Par défaut, le processus de redirection du journal est lancé sans
637   invoquer un shell. Pour invoquer un shell, utilisez "<code>|$</code>"
638   au lieu de "<code>|</code>" (en général avec <code>/bin/sh -c</code>)
639   :</p>
640
641     <highlight language="config">
642 # Invocation de "rotatelogs" en utilisant un shell
643 CustomLog "|$/usr/local/apache/bin/rotatelogs   /var/log/access_log 86400" common
644     </highlight>
645
646
647     <p>Il s'agissait du comportement par défaut sous Apache 2.2. Selon
648     les spécificités du shell, ceci peut générer un processus shell
649     supplémentaire pour toute la durée du programme de redirection du
650     journal, et induire des problèmes de gestion de signaux au cours du
651     redémarrage. La notation "<code>||</code>" est aussi supportée pour
652     des raisons de compatibilité avec Apache 2.2 et est équivalente à
653     "<code>|</code>".</p>
654
655     <note><title>Note à propos de la plateforme Windows</title>
656     <p>Notez que sous Windows, la mémoire allouée au bureau (desktop
657     heap) peut devenir insuffisante si vous utilisez de nombreux
658     processus vers lesquels sont redirigés des journaux via un pipe, et
659     ceci particulièrement si httpd s'exécute en tant que service. La
660     quantité de mémoire du bureau allouée à chaque service est spécifiée
661     dans le troisième argument du paramètre <code>SharedSection</code>
662     de la clé de registre
663     HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SessionManager\SubSystems\Windows.
664     <strong>Modifiez cette valeur avec prudence</strong> ; les
665     précautions d'usage s'imposent lorsqu'on modifie la base de registre,
666     mais vous pouvez aussi saturer la mémoire du bureau si vous
667     spécifiez une valeur trop élevée.</p>
668     </note>
669     </section>
670
671   <section id="virtualhost">
672     <title>Hôtes virtuels</title>
673
674     <p>Lorsqu'un serveur possède plusieurs <a href
675     ="vhosts/">hôtes virtuels</a>, il existe de nombreuses solutions pour gérer
676     les fichiers journaux. Par exemple, on peut utiliser les journaux comme
677     s'il s'agissait d'un serveur avec un seul hôte. Il suffit pour cela de
678     placer les directives de journalisation en dehors des sections
679     <directive module="core" type="section">VirtualHost</directive> au niveau
680     du serveur principal, ce qui a pour effet de journaliser toutes les
681     requêtes dans le même journal des accès et des erreurs. Cette technique
682     est cependant inappropriée pour recueillir des statistiques sur chaque
683     hôte virtuel individuellement.</p>
684
685     <p>Si des directives <directive module=
686     "mod_log_config">CustomLog</directive> ou
687     <directive module="core">ErrorLog</directive> sont placées dans une section
688     <directive module="core" type="section">VirtualHost</directive>, toutes les
689     requêtes ou erreurs pour cet hôte virtuel ne seront enregistrées que dans
690     le fichier spécifié. Tout hôte virtuel qui ne possède pas de directives de
691     journalisation verra ses requêtes enregistrées dans le journal du serveur
692     principal. Cette technique est appropriée pour un petit nombre d'hôtes
693     virtuels, mais si ce nombre est important, elle peut devenir compliquée à
694     gérer. En outre, des problèmes de <a
695     href="vhosts/fd-limits.html">nombre de descripteurs
696     de fichiers insuffisant</a> peuvent rapidement apparaître.</p>
697
698     <p>Il existe un très bon compromis pour le journal des accès. En intégrant
699     les informations à propos de l'hôte virtuel à la chaîne de format du
700     journal, il est possible de journaliser tous les hôtes dans le même
701     journal, puis de séparer ultérieurement le journal en plusieurs journaux
702     individuels. Considérons par exemple les directives suivantes :</p>
703
704     <highlight language="config">
705 LogFormat "%v %l %u %t \"%r\" %&gt;s %b" comonvhost
706 CustomLog "logs/access_log" comonvhost
707     </highlight>
708
709     <p>Le champ <code>%v</code> sert à enregistrer le nom de l'hôte virtuel qui
710     traite la requête. Un programme tel que <a
711     href="programs/split-logfile.html">split-logfile</a> peut ensuite être utilisé
712     pour générer "à froid" autant de journaux que d'hôtes virtuels.</p>
713   </section>
714
715   <section id="other">
716     <title>Autres fichiers journaux</title>
717
718     <related>
719       <modulelist>
720         <module>mod_logio</module>
721         <module>mod_log_config</module>
722         <module>mod_log_forensic</module>
723         <module>mod_cgi</module>
724       </modulelist>
725       <directivelist>
726         <directive module="mod_log_config">LogFormat</directive>
727         <directive module="mod_log_config">BufferedLogs</directive>
728         <directive module="mod_log_forensic">ForensicLog</directive>
729         <directive module="mpm_common">PidFile</directive>
730         <directive module="mod_cgi">ScriptLog</directive>
731         <directive module="mod_cgi">ScriptLogBuffer</directive>
732         <directive module="mod_cgi">ScriptLogLength</directive>
733       </directivelist>
734     </related>
735
736     <section>
737       <title>Enregistrement du nombre réel d'octets envoyés et reçus</title>
738
739       <p>Le module <module>mod_logio</module> fournit deux champs
740       <directive module="mod_log_config">LogFormat</directive> supplémentaires
741       (%I et %O) qui permettent d'enregistrer le nombre réel d'octets reçus et
742       envoyés sur le réseau.</p>
743     </section>
744
745     <section>
746       <title>Journalisation de style investigation judiciaire (forensic logging)</title>
747
748       <p>Le module <module>mod_log_forensic</module> permet la journalisation
749       à des fins d'investigation judiciaire des requêtes des clients. La
750       journalisation est effectuée avant et après le traitement de la requête,
751       qui fait donc l'objet de deux entrées dans le journal. Le générateur de
752       journaux d'investigation est très strict et ne permet aucune
753       personnalisation. C'est un inestimable outil de débogage et de sécurité.</p>
754     </section>
755
756     <section id="pidfile">
757       <title>Fichier PID</title>
758
759       <p>Au démarrage, le démon httpd Apache enregistre l'identifiant du
760       processus httpd parent dans le fichier <code>logs/httpd.pid</code>.
761       Le nom de ce fichier peut être modifié à l'aide de la directive
762       <directive module="mpm_common">PidFile</directive>. Cet identifiant
763       permet à l'administrateur de redémarrer et arrêter le démon en
764       envoyant des signaux au processus parent ; sous Windows, vous devez
765       utiliser l'option de ligne de commande -k. Pour plus de détails,
766       consulter la page <a href="stopping.html">Arrêt et redémarrage</a>.</p>
767     </section>
768
769     <section id="scriptlog">
770       <title>Journal des scripts</title>
771
772       <p>Afin de faciliter le débogage, la directive
773       <directive module="mod_cgi">ScriptLog</directive> vous permet
774       d'enregistrer les entrées et sorties des scripts CGI. Elle ne doit être
775       utilisée que pendant la phase de test, et en aucun cas sur un
776       serveur en production. Vous trouverez plus d'informations dans la
777       documentation du module <a href="mod/mod_cgi.html">mod_cgi</a>.</p>
778     </section>
779     
780   </section>
781 </manualpage>
782
783
784
785