1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE manualpage SYSTEM "./style/manualpage.dtd">
3 <?xml-stylesheet type="text/xsl" href="./style/manual.tr.xsl"?>
4 <!-- English Revision: 1300924:1741842 (outdated) -->
5 <!-- =====================================================
6 Translated by: Nilgün Belma Bugüner <nilgun belgeler.org>
7 Reviewed by: Orhan Berent <berent belgeler.org>
8 ========================================================== -->
11 Licensed to the Apache Software Foundation (ASF) under one or more
12 contributor license agreements. See the NOTICE file distributed with
13 this work for additional information regarding copyright ownership.
14 The ASF licenses this file to You under the Apache License, Version 2.0
15 (the "License"); you may not use this file except in compliance with
16 the License. You may obtain a copy of the License at
18 http://www.apache.org/licenses/LICENSE-2.0
20 Unless required by applicable law or agreed to in writing, software
21 distributed under the License is distributed on an "AS IS" BASIS,
22 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
23 See the License for the specific language governing permissions and
24 limitations under the License.
27 <manualpage metafile="logs.xml.meta">
29 <title>Günlük Dosyaları</title>
32 <p>Bir HTTP sunucusunu verimli şekilde yönetebilmek için oluşabilecek
33 sorunlardan başka sunucunun başarımı ve etkinliği hakkında da bazı geri
34 bildirimler almak gerekir. Apache HTTP Sunucusu çok kapsamlı ve esnek
35 bir günlükleme yeteneğine sahiptir. Bu belgede sunucunun günlükleme
36 yeteneğini nasıl yapılandıracağınızdan ve günlük kayıtlarını nasıl
37 yorumlayacağınızdan bahsedilecektir.</p>
40 <section id="overview">
45 <module>mod_log_config</module>
46 <module>mod_log_forensic</module>
47 <module>mod_logio</module>
48 <module>mod_cgi</module>
52 <p>Apache HTTP Sunucusu, isteğin ilk alınışından itibaren, URL eşleme
53 işlemleri, bağlantının son çözümlemesi ve bu işlemler sırasına ortaya çıkan
54 hatalar da dahil olmak üzere sunucunuzda meydana gelen herşeyi günlüklemek
55 için çok çeşitli mekanizmalar içerir. Buna ek olarak, günlükleme
56 yetenekleri sağlayan üçüncü parti modüller de kullanılabilir veya mevcut
57 günlük dosyalarına girdiler enjekte edilebilir. Ayrıca, CGI programları,
58 PHP betikleri ve benzerleri sunucu hata günlüğüne kendi iletilerini
61 <p>Bu belgede Apache HTTP Sunucusunun standart parçası olan günlükleme
62 modülleri hakkında bilgi verilecektir.</p>
66 <section id="security">
67 <title>Güvenlik Uyarısı</title>
69 <p>Apache httpd’nin günlük dosyalarını yazdığı dizine yazabilen birinin sunucuyu
70 başlatan kullanıcı kimliğine (bu genellikle root olur) erişim
71 kazanabileceğine hemen hemen kesin gözüyle bakılabilir. Sonuçlarının
72 neler olacağını kestiremiyorsanız günlüklerin yazıldığı dizinde <em>hiç
73 kimseye</em> yazma erişimi vermeyin; ayrıntılı bilgi için <a
74 href="misc/security_tips.html">güvenlik ipuçları</a> belgesine
77 <p>Buna ilaveten, günlük dosyaları istemci tarafından sağlanmış bilgiler
78 de içerebilir. Bu nedenle, kötü niyetli istemcilerin günlük dosyalarına
79 denetim karakterleri girmeleri olasılığına karşı ham günlükler ele
80 alınırken dikkatli olunmalıdır.</p>
83 <section id="errorlog">
84 <title>Hata Günlüğü</title>
90 <directive module="core">ErrorLog</directive>
91 <directive module="core">ErrorLogFormat</directive>
92 <directive module="core">LogLevel</directive>
96 <p>İsmi ve yeri <directive module="core">ErrorLog</directive> yönergesi
97 ile belirtilen sunucu hata günlüğü, en önemli günlük dosyasıdır. Apache
98 httpd tarafından istekler işlenirken saptanan hatalar ve tanı bilgileri
99 bu dosyaya gönderilir. Sunucuyu başlatırken veya sunucu çalışırken bir
100 sorunla karşılaşıldığında, neyin yanlış gittiğini öğrenmek için
101 bakılacak ilk yer burasıdır. Günlük kaydı çoğunlukla sorunun nasıl
102 düzeltileceği ile ilgili ayrıntıları da içerir.</p>
104 <p>Hata günlüğü normal olarak bir dosyaya yazılır (genellikle, dosyanın
105 ismi Unix sistemlerinde <code>error_log</code>, OS/2 ve Windows’ta ise
106 <code>error.log</code>’dur). Ayrıca, Unix sistemlerinde sunucunun
107 hataları <code>syslog</code>’a veya <a href="#piped">borulamak suretiyle
108 bir programa</a> aktarması da mümkündür.</p>
110 <p>Hata günlüğünün biçemi <directive module="core"
111 >ErrorLogFormat</directive> yönergesi ile belirlenir. Bu yönergeyi
112 kullanarak günlüklenen değerleri özelleştirebilirsiniz. Bir biçem
113 belirtmezseniz öntanımlı biçem kullanılır. Örnek tipik bir hata iletisi
117 [Fri Sep 09 10:42:29.902022 2011] [core:error] [pid 35708:tid 4328636416]
118 [client 72.15.99.187] Dosya yok: /usr/local/apache2/htdocs/favicon.ico
121 <p>Günlük girdisinin ilk öğesi iletinin yazıldığı tarih ve saatten oluşur.
122 İkincisi iletiyi üreten modülün ismi (bu durumda: core) ile raporlanan
123 bilginin önem derecesini belirtir. Bunu varsa sürecin kimliği ve yine
124 varsa evre kimliği izler. Sonraki öğe hatanın üretilmesine sebep olan
125 istemcinin IP adresini içerir. Kalanı iletinin kendisidir (duruma
126 bakılırsa bir dosyaya yapılan istek yerine getirilememiş).</p>
128 <p>Hata günlüğünde görünebilecek ileti çeşitliliği oldukça fazladır. Çoğu
129 yukarıdaki örneğin benzeridir. Hata günlüğü ayrıca, CGI betiklerinin
130 hata ayıklama çıktılarını da içerir. Bir CGI betiği tarafından standart
131 hataya (<code>stderr</code>) yazılan her türlü bilgi doğrudan hata
132 günlüğüne kopyalanır.</p>
134 <p>Hata günlüğüne ve erişim günlüğüne <code>%L</code> dizgeciği konularak
135 erişim günlüğündeki girdi ile hata günlüğündeki girdiyi ilişkilendirecek
136 bir günlük girdisi kimliği oluşturulabilir.
137 <module>mod_unique_id</module> yüklüyse günlük girdisi kimliği olarak
138 onun eşsiz istek kimliği de kullanılır.</p>
140 <p>Sunucuyu denerken olası sorunlara karşı hata günlüğünü sürekli
141 izlemelisiniz. Unix sistemlerinde bunu şöyle bir komutla
142 sağlayabilirsiniz:</p>
149 <section id="permodule">
150 <title>Modüllere göre günlükleme</title>
152 <p><directive module="core">LogLevel</directive> yönergesi, günlük
153 iletisinin üretilmesine sebep olan modüle bağlı bir önem seviyesi
154 belirleyebilmenizi sağlar. Bu yolla sorun yaşadığınız modülle ilgili
155 günlük musluklarını sonuna kadar açabiliri ek olarak ilgilendiğiniz diğer
156 modüllerle ilgili ayrıntıları da edinebilirsiniz. Özellikle
157 <module>mod_proxy</module> veya <module>mod_rewrite</module> gibi
158 modüllerde yapılmak isteneni denerken neler olup bittiğini ayrıntılarıyla
159 bilmek istediğiniz durumlarda kullanışlıdır.</p>
161 <p>Bunu <directive>LogLevel</directive> yönergesinde modülün ismini
162 belirterek yapabilirsiniz:</p>
165 LogLevel info rewrite:trace5
168 <p>Bu satırla ana <directive>LogLevel</directive> info'ya ayarlanırken
169 <module>mod_rewrite</module> için musluk <code>trace5</code> seviyesine
170 kadar açılmaktadır.</p>
172 <note>Bu yönerge, Apache HTTP Sunucusunun evvelki sürümlerinde mevcut olan
173 <code>RewriteLog</code> gibi günlükleme modüllerinin yerini almıştır.
177 <section id="accesslog">
178 <title>Erişim Günlüğü</title>
182 <module>mod_log_config</module>
183 <module>mod_setenvif</module>
186 <directive module="mod_log_config">CustomLog</directive>
187 <directive module="mod_log_config">LogFormat</directive>
188 <directive module="mod_setenvif">SetEnvIf</directive>
192 <p>Sunucu erişim günlüğü sunucu tarafından işleme alınan tüm istekleri
193 kaydeder. Erişim günlüğünün yeri ve içeriği <directive
194 module="mod_log_config">CustomLog</directive> yönergesi ile belirlenir.
195 <directive module="mod_log_config">LogFormat</directive> yönergesi ile
196 günlük içeriğini kişiselleştirmek mümkündür. Bu bölümde sunucunun
197 bilgileri erişim günlüğüne kaydetmesi için nasıl yapılandırılacağından
200 <p>Şüphesiz, bilginin erişim günlüğünde saklanması günlük yönetiminde ilk
201 adımı oluşturur. Sonraki adım yararlı istatistikleri üretmek için bu
202 bilgiyi incelemektir. Günlük incelemesi bu belgenin kapsamına dahil
203 değildir ve aslında bu işlem sunucunun yaptığı işlerden biri değildir.
204 Bu konu ve günlük incelemesi yapan uygulamalar hakkında daha ayrıntılı
205 bilgi edinmek için <a
206 href="http://dmoz.org/Computers/Software/Internet/Site_Management/Log_analysis/"
210 <p>Apache httpd’nin çeşitli sürümlerinde erişim günlüklerini denetlemek
211 için kullanılan diğer modüller ve yönergeler arasında mod_log_referer,
212 mod_log_agent modülleri ve <code>TransferLog</code> yönergesi
213 sayılabilir. Artık, daha eski tüm diğer yönergelerin işlevselliklerini
214 bir araya toplayan <directive module="mod_log_config"
215 >CustomLog</directive> yönergesi kullanılmaktadır.</p>
217 <p>Erişim günlüğünün girdi biçemi kolayca isteğe göre
218 düzenlenebilmektedir. Biçemi belirtmekte kullanılan biçem dizgesi, C
219 tarzı printf(1) biçem dizgesini andırır. Sonraki bölümlerde bazı
220 örneklere yer verilmiştir. Biçem dizgesini oluşturan belirteçlerin tam
221 listesi için <module>mod_log_config</module> belgesinin <a
222 href="mod/mod_log_config.html#formats">Günlük Girdilerinin
223 Kişiselleştirilmesi</a> bölümüne bakınız.</p>
225 <section id="common">
226 <title>Ortak Günlük Biçemi (OGB)</title>
228 <p>Erişim günlüğü için sıklıkla kullanılan bir yapılandırma:</p>
231 LogFormat "%h %l %u %t \"%r\" %>s %b" common<br />
232 CustomLog logs/access_log common
235 <p>İlk satırda belli bir biçem dizgesi için <code>common</code> diye bir
236 <em>takma ad</em> tanımlanmaktadır. Biçem dizgesi, sunucuya hangi
237 belli bir bilgi parçalarını günlükleyeceğini söyleyen % imli biçem
238 belirteçlerinden oluşur. Biçem dizgesine ayrıca dizgesel sabitler de
239 yerleştirilebilir ve bunlar erişim günlüğüne oldukları gibi
240 kopyalanırlar. Biçem dizgesi içinde çift tırnak karakteri (") biçem
241 dizgesini vaktinden önce sonlandırmaması için ters bölü çizgisi ile
242 öncelenmelidir. Biçem dizgesi ayrıca, satır sonlarını belirtmek için
243 "<code>\n</code>" ve sekmeleri belirtmek için "<code>\t</code>"
244 denetim karakterlerini de içerebilir.</p>
246 <p><directive module="mod_log_config">CustomLog</directive> yönergesi
247 evvelce tanımlanmış bir <em>takma adı</em> kullanarak yeni bir günlük
248 dosyası tanımlar. Erişim günlüğünün dosya ismi bölü çizgisi ile
249 başlamadıkça dosya yolunun <directive module="core"
250 >ServerRoot</directive> değerine göreli olduğu varsayılır.</p>
252 <p>Yukarıdaki yapılandırma günlük dosyasına girdileri Ortak Günlük
253 Biçemi (Common Log Format) adı verilen standart biçemde yazar.
254 Bu standart biçem başka HTTP sunucuları tarafından da kullanılır ve
255 çoğu günlük inceleme yazılımı tarafından tanınır. Ortak Günlük
256 Biçeminde üretilen günlük girdileri şöyle görünür:</p>
259 127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET
260 /apache_pb.gif HTTP/1.0" 200 2326
263 <p>Bu günlük girdisini parça parça açıklayalım:</p>
266 <dt><code>127.0.0.1</code> (<code>%h</code>)</dt>
268 <dd>Bu, sunucuya istek yapan istemcinin (uzak konağın) IP adresidir.
269 Eğer <directive module="core">HostnameLookups</directive>
270 yönergesine <code>On</code> değeri atanmışsa sunucu bu IP adresi
271 için DNS sorgusu yapacak ve IP adresi yerine bulduğu konak ismini
272 yazmaya çalışacaktır. Bununla birlikte, bu işlem sunucuyu epeyce
273 yavaşlattığından önerilmemektedir. Konak isimlerini saptamak için en
274 iyisi günlük girdilerini <program>logresolve</program> gibi bir
275 günlük işlemcisinden geçirmektir. Burada raporlanan IP adresi
276 doğrudan istemcinin IP adresi olmayabilir. Eğer sunucu ile istemci
277 arasında bir vekil sunucu varsa bu IP adresi, vekil sunucunun IP
278 adresi olacaktır.</dd>
280 <dt><code>-</code> (<code>%l</code>)</dt>
282 <dd>Çıktıdaki bir "tire" imi istenen bilgi parçasının mevcut olmadığı
283 anlamına gelir. Bu durumda, mevcut olmayan bilgi istemci makine
284 üzerinde <code>identd</code> tarafından belirlenen istemcinin RFC
285 1413 kimliğidir. Bu bilgi oldukça güvenilmezdir ve sıkıca denetlenen
286 iç ağlar haricinde hemen hemen asla kullanılmamalıdır. Apache,
287 <directive module="mod_ident">IdentityCheck</directive> yönergesine
288 <code>On</code> değeri atanmış olmadıkça bu bilgiyi saptamaya
291 <dt><code>frank</code> (<code>%u</code>)</dt>
293 <dd>Bu, belge isteğinde bulunan kişinin HTTP kimlik doğrulamasıyla
294 saptanan kullanıcı kimliğidir. Bu değer CGI betiklerine
295 <code>REMOTE_USER</code> ortam değişkeni ile sağlanır. Eğer istek
296 için durum kodu 401 ise (aşağıya bakınız) henüz kullanıcının kimliği
297 doğrulanmamış olacağından bu değere güvenilmemelidir. Eğer belge
298 parola korumalı değilse günlüğün bu kısmı da yukarıdaki gibi
299 "<code>-</code>" olacaktır.</dd>
301 <dt><code>[10/Oct/2000:13:55:36 -0700]</code>
302 (<code>%t</code>)</dt>
304 <dd>İsteğin alındığı tarih ve saat. Biçemi şöyledir:
307 <code>[gün/ay/yıl:saat:dakika:saniye dilim]<br />
312 dakika = 2 hane<br />
313 saniye = 2 hane<br />
314 dilim = (`+' | `-') 4 hane</code>
316 <p>Günlük biçem dizgesinde zaman gösterim biçemini
317 <code>%{<em>biçem</em>}t</code> şeklinde belirtmek de mümkündür.
318 Buradaki <code><em>biçem</em></code> dizgesi, stardart C
319 kütüphanesindeki <code>strftime(3)</code> işlevi için tanımlanmış
320 biçem belirteçleriyle veya desteklenen özel belirteçlerle
321 oluşturulabilir. Ayrıntılı bilgi için <module>mod_log_config</module>
322 <a href="mod/mod_log_config.html#formats">biçem dizgelerine</a>
326 <dt><code>"GET /apache_pb.gif HTTP/1.0"</code>
327 (<code>\"%r\"</code>)</dt>
329 <dd>İstemciden alınan istek satırının çift tırnaklar arasında
330 gösterilmesi istenmiştir. İstek satırı en yararlı bilgi parçalarını
331 içerir. Birincisi, istemci tarafından kullanılan yöntem
332 <code>GET</code>’miş. İkinci olarak istemci
333 <code>/apache_pb.gif</code> dosyasını istemiş ve üçüncü olarak
334 istemci <code>HTTP/1.0</code> protokolünü kullanmış. İstek satırının
335 bazı parçalarını bağımsız olarak da günlüklemek mümkündür. Örneğin,
336 "<code>%m %U%q %H</code>" dizgesi, yöntem, yol, sorgu dizgesi ve
337 protokolü kaydedecektir; bu dizge "<code>%r</code>" biçem
338 belirtecinin tek başına yaptığı işi yapar.</dd>
340 <dt><code>200</code> (<code>%>s</code>)</dt>
342 <dd>Bu, sunucunun istemciye gönderdiği durum kodudur. İsteğin
343 başarıyla yerine getirilip getirilmediğini gösterdiği için bu bilgi
344 çok değerlidir. Durum kodu 2 ile başlıyorsa istek başarıyla yerine
345 getirilmiştir, 3 ile başlıyorsa yönlendirilmiştir, 4 ile başlıyorsa
346 istemci tarafında bir hata oluşmuştur, 5 ile başlıyorsa sunucuda bir
347 hata oluşmuştur. Olası hata kodlarının tam listesi <a
348 href="http://www.w3.org/Protocols/rfc2616/rfc2616.txt">RFC2616 Hiper
349 Metin Aktarım Protokolü</a>nün 10. bölümünde bulunabilir.</dd>
351 <dt><code>2326</code> (<code>%b</code>)</dt>
353 <dd>Son parça istemciye döndürülen nesnenin yanıt başlığı hariç
354 uzunluğudur. Eğer istemciye bir içerik döndürülmemişse bu değer
355 "<code>-</code>" olacaktır. Bunun yerine günlüğe "<code>0</code>"
356 yazdırmak için <code>%B</code> belirtecini kullanınız.</dd>
360 <section id="combined">
361 <title>Birleşik Günlük Biçemi</title>
363 <p>Sıklıkla kullanılan diğer bir biçem dizgesi Birleşik Günlük Biçemi
364 (Combined Log Format) olup şöyle kullanılabilir:</p>
367 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\"
368 \"%{User-agent}i\"" combined<br />
369 CustomLog log/access_log combined
372 <p>Bu biçem ilaveten 2 alan içermesi dışında Ortak Günlük Biçemi ile
373 aynıdır. İlave alanların ikisi de <code>%{<em>başlık</em>}i</code>
374 biçeminde olup buradaki <code><em>başlık</em></code>, HTTP isteğindeki
375 başlık alanlarından biridir. Bu biçemin kullanıldığı bir erişim
376 günlüğü girdisi şöyle olurdu:</p>
379 127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET
380 /apache_pb.gif HTTP/1.0" 200 2326
381 "http://www.example.com/start.html" "Mozilla/4.08 [en]
388 <dt><code>"http://www.example.com/start.html"</code>
389 (<code>\"%{Referer}i\"</code>)</dt>
391 <dd>HTTP istek başlığı "Referer". İstemcinin raporladığı isteğin
392 kaynaklandığı URI. (Bu isteğin yapılmasını sağlayan bağlantıyı
393 içeren URL veya istek bir sayfanın bileşenleri ile ilgiliyse istenen
394 sayfanın URL’si olabilir.)</dd>
396 <dt><code>"Mozilla/4.08 [en] (Win98; I ;Nav)"</code>
397 (<code>\"%{User-agent}i\"</code>)</dt>
399 <dd>Tarayıcı kimliğini içeren HTTP istek başlığı. Bu istemcinin
400 tarayıcısının raporladığı kendi tanıtım bilgisidir.</dd>
404 <section id="multiple">
405 <title>Çok Sayıda Erişim Günlüğü</title>
407 <p>Yapılandırma dosyasında çok sayıda <directive
408 module="mod_log_config">CustomLog</directive> yönergesi kullanarak çok
409 sayıda erişim günlüğü kolayca oluşturulabilir. Örneğin aşağıdaki
410 yönergelerle 3 tane erişim günlüğü oluşturulacaktır. İlki temel OGB
411 bilgisini içerirken diğer ikisi isteğin kaynaklandığı yeri ve tarayıcı
412 kimliğini içerir. Son iki <directive module="mod_log_config"
413 >CustomLog</directive> satırı ayrıca, <code>ReferLog</code> ve
414 <code>AgentLog</code> yönergelerinin etkilerinin nasıl taklit
415 edileceğini de göstermektedir.</p>
418 LogFormat "%h %l %u %t \"%r\" %>s %b" common<br />
419 CustomLog logs/access_log common<br />
420 CustomLog logs/referer_log "%{Referer}i -> %U"<br />
421 CustomLog logs/agent_log "%{User-agent}i"
424 <p>Bu örnek ayrıca, <directive module="mod_log_config"
425 >LogFormat</directive> yönergesi ile bir takma ad tanımlamanın şart
426 olmadığını da göstermektedir. Günlük biçemi doğrudan <directive
427 module="mod_log_config">CustomLog</directive> yönergesinde
431 <section id="conditional">
432 <title>Şarta Bağlı Günlükler</title>
434 <p>Bazı durumlarda istemcinin yaptığı isteğe bağlı olarak erişim
435 günlüğünde belli girdilerin dışlanması gerekebilir. Bu, <a
436 href="env.html" >ortam değişkenleri</a> sayesinde kolayca yerine
437 getirilebilir. Önce isteğin belli koşulları sağladığını belirten bir
438 ortam değişkeni ataması yapılır. Bu işlem <directive
439 module="mod_setenvif">SetEnvIf</directive> yönergesi ile yapılır.
440 Sonra da, ortam değişkenine bağlı olarak isteklerin günlüğe dahil
441 edilip edilmeyeceği <directive
442 module="mod_log_config">CustomLog</directive> yönergesinin
443 <code>env=</code> deyimi kullanılarak belirtilir. Bazı örnekler:</p>
446 # yerel konaktan kaynaklanan istekleri imleyelim<br />
447 SetEnvIf Remote_Addr "127\.0\.0\.1" kaydetme<br />
448 # robots.txt dosyası isteklerini imleyelim<br />
449 SetEnvIf Request_URI "^/robots\.txt$" kaydetme<br />
450 # Kalanları günlüğe kaydedelim<br />
451 CustomLog logs/access_log common env=!kaydetme
454 <p>Başka bir örnek olarak, Türkçe belge isteklerini bir dosyaya diğer
455 dillerdeki istekleri başka bir dosyaya kaydedelim.</p>
458 SetEnvIf Accept-Language "tr" turkce<br />
459 CustomLog logs/turkce_log common env=turkce<br />
460 CustomLog logs/diger_diller_log common env=!turkce
463 <p>Bir arabellkleme senaryosuna arabelleğin verimli kullanılıp
464 kullanılmadığını bilmek isteyelim. Bu basitçe şöyle yapılabilir:</p>
467 SetEnv CACHE_MISS 1<br />
468 LogFormat "%h %l %u %t "%r " %>s %b %{CACHE_MISS}e" common-cache<br />
469 CustomLog logs/access_log common-cache
472 <p><module>mod_cache</module> önce <module>mod_env</module> modülünü
473 çalıştıracak ve başarılı olunduğu takdirde içeriği onsuz teslim
474 edecektir. Bu durumda arabellek kaybı <code>1</code> olarak
475 günlüklenirken arabellek sunumu <code>-</code> olarak
476 günlüklenecektir.</p>
478 <p><code>env=</code> sözdizimine ek olarak, <directive
479 module="mod_log_config">LogFormat</directive> HTTP yanıt kodudaki koşul
480 değerlerini günlüklemeyi de destekler:</p>
483 LogFormat "%400,501{User-agent}i" browserlog<br />
484 LogFormat "%!200,304,302{Referer}i" refererlog
487 <p>Bu örnekte, HTTP durum kodu 400 veya 501 ise <code>User-agent</code>
488 başlığı günlüklenecektir. Aksi takdirde, günlüğe bir "-" yazılacaktır.
489 Benzer şekilde ikinci örnekte, HTTP durum kodu 200, 204 veya 302
490 <strong>değilse</strong> (durum kodlarının öncesindeki "!" imine
491 dikkat) <code>Referer</code> başlığı günlüklenecektir.</p>
493 <p>Koşulaa bağlı günlük kaydının çok esnek ve güçlü olabileceğini
494 göstermiş olsak da günlük içeriğini denetlemenin tek yolu bu değildir.
495 Günlük dosyaları sunucu etkinliğini eksiksiz olarak kaydedebildikleri
496 takdirde daha yararlı olurlar. Günlük dosyalarını sonradan işleme tabi
497 tutarak istenmeyen girdileri kaldırılmış bir kopya almak hem kolay hem
498 de daha yararlıdır.</p>
502 <section id="rotation">
503 <title>Günlük Çevrimi</title>
505 <p>Yükü ağır sunucularda günlük dosyalarına kaydedilen bilginin miktarı
506 çok büyük boyutlara ulaşabilir. 10.000 istek içeren bir erişim günlüğü
507 yaklaşık 1MB yer kaplar. Etkin günlük dosyasını belirli aralıklarla
508 değiştirmek veya silmek gerekebilir. Apache httpd çalışırken dosyayı sürekli
509 açık tuttuğu ve yazdığı için bu işlem sunucu çalışırken yapılamaz. Bu
510 bakımdan, günlük dosyası değiştirildikten veya silindikten sonra yeni
511 dosyanın açılması için <a href="stopping.html">sunucunun yeniden
512 başlatılması</a> gerekir.</p>
514 <p><a href="stopping.html#graceful">Nazikçe yeniden başlatmak</a>
515 suretiyle sunucunun, mevcut ve bekleyen bağlantıları kaybetmeden yeni
516 günlük dosyalarını açması sağlanabilir. Bununla birlikte, bu işlem
517 sırasında sunucunun eski isteklere sunumu bitirene kadar eski günlük
518 dosyalarına yazmaya devam edebilmesi gerekir. Bu bakımdan, yeniden
519 başlatmanın ardından eski günlük dosyaları üzerinde bir işlem yapmadan
520 önce biraz beklemek gerekir. Günlük dosyalarını döndürürken kullanılan
521 senaryolarda genellikle eski günlük dosyaları yer kazanmak için
525 mv access_log access_log.old<br />
526 mv error_log error_log.old<br />
527 apachectl graceful<br />
529 gzip access_log.old error_log.old
532 <p>Günlük çevrimi yapmanın başka bir yolu da sonraki bölümde açıklandığı
533 gibi <a href="#piped">borulu günlükler</a> kullanmaktır.</p>
537 <title>Borulu Günlükler</title>
539 <p>Apache httpd hata ve erişim günlüklerini doğrudan bir dosyaya yazmak
540 yerine bir boru üzerinden başka bir sürece yazabilir. Bu yetenek ana
541 sunucuya herhangi bir kod eklemeksizin günlükleme esnekliğini şaşırtıcı
542 derecede arttırır. Günlükler boruya yazılmak istenirse dosya ismini boru
543 karakteriyle ("<code>|</code>") değiştirip ardına günlük girdilerini
544 standart girdisinden kabul edecek programın ismini eklemek yeterlidir.
545 Apache httpd başlatıldığı zaman borulu günlük işlemini de
546 başlatacaktır. Eğer sunucu çalışırken günlükleri kabul eden süreç
547 çökerse Apache httpd bu programı yeniden başlatır. (Bu son özelliği
548 sebebiyle bu tekniğe “güvenilir borulu günlükleme” adını veriyoruz.)</p>
550 <p>Borulu günlük süreçleri ana Apache httpd süreci tarafından başlatılır
551 ve bu süreçler ana Apache httpd sürecinin kullanıcı kimliğini miras
552 alırlar. Yani borulu günlükleme programları aslında root tarafından
553 çalıştırılmış gibi olur. Bu bakımdan, bu programları basit ve güvenilir
554 kılmak çok önemlidir.</p>
556 <p>Borulu günlüklerin önemli kullanım alanlarından biri de sunucuyu
557 yeniden başlatmak gerekmeksizin günlük çevrimini mümkün kılmaktır.
558 Apache HTTP sunucusu bu amaçla kullanılmak üzere
559 <program>rotatelogs</program> diye bir program içerir. Örneğin,
560 günlükleri 24 saatte bir döndürmek isterseniz bunu şöyle
564 CustomLog "|/usr/local/apache/bin/rotatelogs
565 /var/log/access_log 86400" common
568 <p>Borunun diğer ucundaki süreci başlatacak komutun tırnak içine
569 alındığına dikkat ediniz. Bu örnekler erişim günlüğü için verilmişse de
570 aynı teknik hata günlüğü için de kullanılabilir.</p>
572 <p>Hariçten bir uygulama olarak <a
573 href="http://www.cronolog.org/">cronolog</a> isminde buna benzer ancak
574 çok daha esnek bir program daha vardır.</p>
576 <p>Borulu günlükler de şarta bağlı günlükleme kadar güçlü olmakla beraber
577 çevrimdışı ardıl işlemler gibi daha basit çözümler için
578 kullanılmamalıdır.</p>
580 <p>Öntanımlı olarak borulu günlük süreci bir kabuk kullanmadan
581 çalıştırılır. Kabuk kullanarak (genelde <code>/bin/sh -c</code> ile)
582 yapılmak istenirse "<code>|</code>" yerine "<code>|$</code>"
586 # Kabu kullanarak "rotatelogs" çalıştırmak<br />
587 CustomLog "|$/usr/local/apache/bin/rotatelogs
588 /var/log/access_log 86400" common
591 <p>Bu, Apache 2.2 için öntanımlı davranıştı. Kabuk özelliklerine bağlı
592 olarak, yeniden başlatma sırasındaki sinyal işleme sorunları ve günlük
593 borulama uygulamasının yaşam süresi için ek bir kabuk süreci ile
594 sonuçlanabilir. Apache 2.2 ile uyumluluk açısından "<code>||</code>"
595 gösterimi de desteklenmekte olup "<code>|</code>" kullanımına
600 <section id="virtualhost">
601 <title>Sanal Konaklar</title>
603 <p>Bir sunucu çok sayıda <a href="vhosts/">sanal konak</a> ile hizmet
604 sunarken bunların günlük kayıtları için çeşitli seçenekler mevcuttur.
605 İlk seçenekte, sanki sunucu tek bir konakla hizmet sunuyormuş gibi
606 günlük kaydı yapılır. Günlükleme yönergelerini <directive module="core"
607 type="section">VirtualHost</directive> bölümlerinin dışına, ana sunucu
608 bağlamına yerleştirerek tüm isteklerin aynı erişim ve hata günlüğüne
609 yazılmasını sağlamak olasıdır. Bu teknik, tek tek sanal konaklar için
610 kolayca istatistik toplamaya izin vermez.</p>
612 <p>Eğer <directive module="mod_log_config">CustomLog</directive>
613 veya <directive module="core">ErrorLog</directive> yönergesi bir
614 <directive module="core" type="section">VirtualHost</directive> bölümüne
615 yerleştirilirse bu sanal konağa bütün erişimler veya hatalar belirtilen
616 dosyaya günlüklenecektir. Böyle günlükleme yönergeleri içermeyen sanal
617 konakların günlükleri hala ana sunucunun hata ve erişim günlüklerine
618 yazılmaya devam edecektir. Bu teknik az sayıda sanal konak barındıran
619 sunucular için çok kullanışlıdır. Fakat sanal konak sayısı çok fazlaysa
620 bu teknikle günlük dosyalarını yönetmek çok karmaşık bir hal alabilir.
621 Ayrıca, <a href="vhosts/fd-limits.html">yetersiz dosya tanıtıcısı</a>
622 sorunlarıyla çok sık karşılaşılabilir.</p>
624 <p>Erişim günlükleri için çok az bir fedakarlıkla çok iyi bir çözüm vardır.
625 Günlük biçemine sanal konaklarla ilgili bilgi eklemek suretiyle tüm
626 konakların aynı günlük dosyasını kullanmaları olasıdır. Böylece günlük
627 dosyası sonradan her sanal konak için ayrı bir dosya oluşturmak üzere
628 ayrıştırılabilir. Örneğin, bu işlem için şu yönergeler kullanılıyor
632 LogFormat "%v %l %u %t \"%r\" %>s %b"
634 CustomLog logs/access_log ortaksankon
637 <p><code>%v</code> belirteci isteği sunan sanal konağın ismini günlüğe
638 yazmak için kullanılır. Daha sonra <a
639 href="programs/other.html">split-logfile</a> gibi bir program
640 kullanarak, bu dosyadan her sanal konak için ayrı birer dosya elde
645 <title>Diğer Günlük Dosyaları</title>
649 <module>mod_logio</module>
650 <module>mod_log_config</module>
651 <module>mod_log_forensic</module>
652 <module>mod_cgi</module>
656 <directive module="mod_log_config">LogFormat</directive>
657 <directive module="mod_log_config">BufferedLogs</directive>
658 <directive module="mod_log_forensic">ForensicLog</directive>
659 <directive module="mpm_common">PidFile</directive>
660 <directive module="mod_cgi">ScriptLog</directive>
661 <directive module="mod_cgi">ScriptLogBuffer</directive>
662 <directive module="mod_cgi">ScriptLogLength</directive>
667 <title>Gönderilen ve alınan bayt sayısının günlüklenmesi</title>
669 <p><module>mod_logio</module> modülü <directive
670 module="mod_log_config">LogFormat</directive> yönergesinde kullanılan
671 biçem belirteçlerine alınan ve gönderilen bayt sayıları için iki
672 belirteç (%I ve %O) ekler.</p>
676 <title>Adli Günlük</title>
678 <p><module>mod_log_forensic</module> modülü istemci isteklerinin kanıt
679 olarak kullanılmak amacıyla günlüklenmesini sağlar. Günlükleme her
680 istek için isteğe hizmet sunmadan önce ve sonra olmak üzere iki defa
681 yapılır. Böylece günlük dosyasında başarılı her istek için iki satır
682 bulunur. Adli günlükleme çok sıkı kurallara tabi olup
683 kişiselleştirilemez. Güvenlik ve hata ayıklama aracı olarak yararlı
687 <section id="pidfile">
688 <title>PID Dosyası</title>
690 <p>Apache httpd başlatıldığında, ana httpd sürecinin kimliği (PID)
691 <code>logs/httpd.pid</code> dosyasına kaydedilir. Bu dosyanın ismi
692 <directive module="mpm_common">PidFile</directive> yönergesi ile
693 değiştirilebilir. Bu süreç kimliği sistem yöneticisi tarafından ana
694 sürece sinyal göndererek artalan sürecini sonlandırmak veya yeniden
695 başlatmak için kullanılır. Windows üzerinde bu işlem için
696 <code>-k</code> komut satırı seçeneği kullanılır. Bu konuda daha
697 ayrıntılı bilgi edinmek için <a href="stopping.html">Durdurma ve
698 Yeniden Başlatma</a> belgesine bakınız.</p>
701 <section id="scriptlog">
702 <title>Betik Günlüğü</title>
704 <p><directive module="mod_cgi">ScriptLog</directive> yönergesi CGI
705 betiklerinin girdi ve çıktılarını kaydetmenizi mümkün kılmak suretiyle
706 hata ayıklamaya yardımcı olur. Bu sadece deneysel amaçla kullanılmalı,
707 asıl sunucuya uygulanmamalıdır. <a href="mod/mod_cgi.html">mod_cgi</a>
708 belgesinde daha fazla bilgi bulunabilir.</p>