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:1657854 (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/"
207 >dmoz.org</a> veya <a
208 href="http://dir.yahoo.com/Computers_and_Internet/Software/Internet/World_Wide_Web/Servers/Log_Analysis_Tools/"
209 >Yahoo</a>’ya bakınız.</p>
211 <p>Apache httpd’nin çeşitli sürümlerinde erişim günlüklerini denetlemek
212 için kullanılan diğer modüller ve yönergeler arasında mod_log_referer,
213 mod_log_agent modülleri ve <code>TransferLog</code> yönergesi
214 sayılabilir. Artık, daha eski tüm diğer yönergelerin işlevselliklerini
215 bir araya toplayan <directive module="mod_log_config"
216 >CustomLog</directive> yönergesi kullanılmaktadır.</p>
218 <p>Erişim günlüğünün girdi biçemi kolayca isteğe göre
219 düzenlenebilmektedir. Biçemi belirtmekte kullanılan biçem dizgesi, C
220 tarzı printf(1) biçem dizgesini andırır. Sonraki bölümlerde bazı
221 örneklere yer verilmiştir. Biçem dizgesini oluşturan belirteçlerin tam
222 listesi için <module>mod_log_config</module> belgesinin <a
223 href="mod/mod_log_config.html#formats">Günlük Girdilerinin
224 Kişiselleştirilmesi</a> bölümüne bakınız.</p>
226 <section id="common">
227 <title>Ortak Günlük Biçemi (OGB)</title>
229 <p>Erişim günlüğü için sıklıkla kullanılan bir yapılandırma:</p>
232 LogFormat "%h %l %u %t \"%r\" %>s %b" common<br />
233 CustomLog logs/access_log common
236 <p>İlk satırda belli bir biçem dizgesi için <code>common</code> diye bir
237 <em>takma ad</em> tanımlanmaktadır. Biçem dizgesi, sunucuya hangi
238 belli bir bilgi parçalarını günlükleyeceğini söyleyen % imli biçem
239 belirteçlerinden oluşur. Biçem dizgesine ayrıca dizgesel sabitler de
240 yerleştirilebilir ve bunlar erişim günlüğüne oldukları gibi
241 kopyalanırlar. Biçem dizgesi içinde çift tırnak karakteri (") biçem
242 dizgesini vaktinden önce sonlandırmaması için ters bölü çizgisi ile
243 öncelenmelidir. Biçem dizgesi ayrıca, satır sonlarını belirtmek için
244 "<code>\n</code>" ve sekmeleri belirtmek için "<code>\t</code>"
245 denetim karakterlerini de içerebilir.</p>
247 <p><directive module="mod_log_config">CustomLog</directive> yönergesi
248 evvelce tanımlanmış bir <em>takma adı</em> kullanarak yeni bir günlük
249 dosyası tanımlar. Erişim günlüğünün dosya ismi bölü çizgisi ile
250 başlamadıkça dosya yolunun <directive module="core"
251 >ServerRoot</directive> değerine göreli olduğu varsayılır.</p>
253 <p>Yukarıdaki yapılandırma günlük dosyasına girdileri Ortak Günlük
254 Biçemi (Common Log Format) adı verilen standart biçemde yazar.
255 Bu standart biçem başka HTTP sunucuları tarafından da kullanılır ve
256 çoğu günlük inceleme yazılımı tarafından tanınır. Ortak Günlük
257 Biçeminde üretilen günlük girdileri şöyle görünür:</p>
260 127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET
261 /apache_pb.gif HTTP/1.0" 200 2326
264 <p>Bu günlük girdisini parça parça açıklayalım:</p>
267 <dt><code>127.0.0.1</code> (<code>%h</code>)</dt>
269 <dd>Bu, sunucuya istek yapan istemcinin (uzak konağın) IP adresidir.
270 Eğer <directive module="core">HostnameLookups</directive>
271 yönergesine <code>On</code> değeri atanmışsa sunucu bu IP adresi
272 için DNS sorgusu yapacak ve IP adresi yerine bulduğu konak ismini
273 yazmaya çalışacaktır. Bununla birlikte, bu işlem sunucuyu epeyce
274 yavaşlattığından önerilmemektedir. Konak isimlerini saptamak için en
275 iyisi günlük girdilerini <program>logresolve</program> gibi bir
276 günlük işlemcisinden geçirmektir. Burada raporlanan IP adresi
277 doğrudan istemcinin IP adresi olmayabilir. Eğer sunucu ile istemci
278 arasında bir vekil sunucu varsa bu IP adresi, vekil sunucunun IP
279 adresi olacaktır.</dd>
281 <dt><code>-</code> (<code>%l</code>)</dt>
283 <dd>Çıktıdaki bir "tire" imi istenen bilgi parçasının mevcut olmadığı
284 anlamına gelir. Bu durumda, mevcut olmayan bilgi istemci makine
285 üzerinde <code>identd</code> tarafından belirlenen istemcinin RFC
286 1413 kimliğidir. Bu bilgi oldukça güvenilmezdir ve sıkıca denetlenen
287 iç ağlar haricinde hemen hemen asla kullanılmamalıdır. Apache,
288 <directive module="mod_ident">IdentityCheck</directive> yönergesine
289 <code>On</code> değeri atanmış olmadıkça bu bilgiyi saptamaya
292 <dt><code>frank</code> (<code>%u</code>)</dt>
294 <dd>Bu, belge isteğinde bulunan kişinin HTTP kimlik doğrulamasıyla
295 saptanan kullanıcı kimliğidir. Bu değer CGI betiklerine
296 <code>REMOTE_USER</code> ortam değişkeni ile sağlanır. Eğer istek
297 için durum kodu 401 ise (aşağıya bakınız) henüz kullanıcının kimliği
298 doğrulanmamış olacağından bu değere güvenilmemelidir. Eğer belge
299 parola korumalı değilse günlüğün bu kısmı da yukarıdaki gibi
300 "<code>-</code>" olacaktır.</dd>
302 <dt><code>[10/Oct/2000:13:55:36 -0700]</code>
303 (<code>%t</code>)</dt>
305 <dd>İsteğin alındığı tarih ve saat. Biçemi şöyledir:
308 <code>[gün/ay/yıl:saat:dakika:saniye dilim]<br />
313 dakika = 2 hane<br />
314 saniye = 2 hane<br />
315 dilim = (`+' | `-') 4 hane</code>
317 <p>Günlük biçem dizgesinde zaman gösterim biçemini
318 <code>%{<em>biçem</em>}t</code> şeklinde belirtmek de mümkündür.
319 Buradaki <code><em>biçem</em></code> dizgesi, stardart C
320 kütüphanesindeki <code>strftime(3)</code> işlevi için tanımlanmış
321 biçem belirteçleriyle veya desteklenen özel belirteçlerle
322 oluşturulabilir. Ayrıntılı bilgi için <module>mod_log_config</module>
323 <a href="mod/mod_log_config.html#formats">biçem dizgelerine</a>
327 <dt><code>"GET /apache_pb.gif HTTP/1.0"</code>
328 (<code>\"%r\"</code>)</dt>
330 <dd>İstemciden alınan istek satırının çift tırnaklar arasında
331 gösterilmesi istenmiştir. İstek satırı en yararlı bilgi parçalarını
332 içerir. Birincisi, istemci tarafından kullanılan yöntem
333 <code>GET</code>’miş. İkinci olarak istemci
334 <code>/apache_pb.gif</code> dosyasını istemiş ve üçüncü olarak
335 istemci <code>HTTP/1.0</code> protokolünü kullanmış. İstek satırının
336 bazı parçalarını bağımsız olarak da günlüklemek mümkündür. Örneğin,
337 "<code>%m %U%q %H</code>" dizgesi, yöntem, yol, sorgu dizgesi ve
338 protokolü kaydedecektir; bu dizge "<code>%r</code>" biçem
339 belirtecinin tek başına yaptığı işi yapar.</dd>
341 <dt><code>200</code> (<code>%>s</code>)</dt>
343 <dd>Bu, sunucunun istemciye gönderdiği durum kodudur. İsteğin
344 başarıyla yerine getirilip getirilmediğini gösterdiği için bu bilgi
345 çok değerlidir. Durum kodu 2 ile başlıyorsa istek başarıyla yerine
346 getirilmiştir, 3 ile başlıyorsa yönlendirilmiştir, 4 ile başlıyorsa
347 istemci tarafında bir hata oluşmuştur, 5 ile başlıyorsa sunucuda bir
348 hata oluşmuştur. Olası hata kodlarının tam listesi <a
349 href="http://www.w3.org/Protocols/rfc2616/rfc2616.txt">RFC2616 Hiper
350 Metin Aktarım Protokolü</a>nün 10. bölümünde bulunabilir.</dd>
352 <dt><code>2326</code> (<code>%b</code>)</dt>
354 <dd>Son parça istemciye döndürülen nesnenin yanıt başlığı hariç
355 uzunluğudur. Eğer istemciye bir içerik döndürülmemişse bu değer
356 "<code>-</code>" olacaktır. Bunun yerine günlüğe "<code>0</code>"
357 yazdırmak için <code>%B</code> belirtecini kullanınız.</dd>
361 <section id="combined">
362 <title>Birleşik Günlük Biçemi</title>
364 <p>Sıklıkla kullanılan diğer bir biçem dizgesi Birleşik Günlük Biçemi
365 (Combined Log Format) olup şöyle kullanılabilir:</p>
368 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\"
369 \"%{User-agent}i\"" combined<br />
370 CustomLog log/access_log combined
373 <p>Bu biçem ilaveten 2 alan içermesi dışında Ortak Günlük Biçemi ile
374 aynıdır. İlave alanların ikisi de <code>%{<em>başlık</em>}i</code>
375 biçeminde olup buradaki <code><em>başlık</em></code>, HTTP isteğindeki
376 başlık alanlarından biridir. Bu biçemin kullanıldığı bir erişim
377 günlüğü girdisi şöyle olurdu:</p>
380 127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET
381 /apache_pb.gif HTTP/1.0" 200 2326
382 "http://www.example.com/start.html" "Mozilla/4.08 [en]
389 <dt><code>"http://www.example.com/start.html"</code>
390 (<code>\"%{Referer}i\"</code>)</dt>
392 <dd>HTTP istek başlığı "Referer". İstemcinin raporladığı isteğin
393 kaynaklandığı URI. (Bu isteğin yapılmasını sağlayan bağlantıyı
394 içeren URL veya istek bir sayfanın bileşenleri ile ilgiliyse istenen
395 sayfanın URL’si olabilir.)</dd>
397 <dt><code>"Mozilla/4.08 [en] (Win98; I ;Nav)"</code>
398 (<code>\"%{User-agent}i\"</code>)</dt>
400 <dd>Tarayıcı kimliğini içeren HTTP istek başlığı. Bu istemcinin
401 tarayıcısının raporladığı kendi tanıtım bilgisidir.</dd>
405 <section id="multiple">
406 <title>Çok Sayıda Erişim Günlüğü</title>
408 <p>Yapılandırma dosyasında çok sayıda <directive
409 module="mod_log_config">CustomLog</directive> yönergesi kullanarak çok
410 sayıda erişim günlüğü kolayca oluşturulabilir. Örneğin aşağıdaki
411 yönergelerle 3 tane erişim günlüğü oluşturulacaktır. İlki temel OGB
412 bilgisini içerirken diğer ikisi isteğin kaynaklandığı yeri ve tarayıcı
413 kimliğini içerir. Son iki <directive module="mod_log_config"
414 >CustomLog</directive> satırı ayrıca, <code>ReferLog</code> ve
415 <code>AgentLog</code> yönergelerinin etkilerinin nasıl taklit
416 edileceğini de göstermektedir.</p>
419 LogFormat "%h %l %u %t \"%r\" %>s %b" common<br />
420 CustomLog logs/access_log common<br />
421 CustomLog logs/referer_log "%{Referer}i -> %U"<br />
422 CustomLog logs/agent_log "%{User-agent}i"
425 <p>Bu örnek ayrıca, <directive module="mod_log_config"
426 >LogFormat</directive> yönergesi ile bir takma ad tanımlamanın şart
427 olmadığını da göstermektedir. Günlük biçemi doğrudan <directive
428 module="mod_log_config">CustomLog</directive> yönergesinde
432 <section id="conditional">
433 <title>Şarta Bağlı Günlükler</title>
435 <p>Bazı durumlarda istemcinin yaptığı isteğe bağlı olarak erişim
436 günlüğünde belli girdilerin dışlanması gerekebilir. Bu, <a
437 href="env.html" >ortam değişkenleri</a> sayesinde kolayca yerine
438 getirilebilir. Önce isteğin belli koşulları sağladığını belirten bir
439 ortam değişkeni ataması yapılır. Bu işlem <directive
440 module="mod_setenvif">SetEnvIf</directive> yönergesi ile yapılır.
441 Sonra da, ortam değişkenine bağlı olarak isteklerin günlüğe dahil
442 edilip edilmeyeceği <directive
443 module="mod_log_config">CustomLog</directive> yönergesinin
444 <code>env=</code> deyimi kullanılarak belirtilir. Bazı örnekler:</p>
447 # yerel konaktan kaynaklanan istekleri imleyelim<br />
448 SetEnvIf Remote_Addr "127\.0\.0\.1" kaydetme<br />
449 # robots.txt dosyası isteklerini imleyelim<br />
450 SetEnvIf Request_URI "^/robots\.txt$" kaydetme<br />
451 # Kalanları günlüğe kaydedelim<br />
452 CustomLog logs/access_log common env=!kaydetme
455 <p>Başka bir örnek olarak, Türkçe belge isteklerini bir dosyaya diğer
456 dillerdeki istekleri başka bir dosyaya kaydedelim.</p>
459 SetEnvIf Accept-Language "tr" turkce<br />
460 CustomLog logs/turkce_log common env=turkce<br />
461 CustomLog logs/diger_diller_log common env=!turkce
464 <p>Bir arabellkleme senaryosuna arabelleğin verimli kullanılıp
465 kullanılmadığını bilmek isteyelim. Bu basitçe şöyle yapılabilir:</p>
468 SetEnv CACHE_MISS 1<br />
469 LogFormat "%h %l %u %t "%r " %>s %b %{CACHE_MISS}e" common-cache<br />
470 CustomLog logs/access_log common-cache
473 <p><module>mod_cache</module> önce <module>mod_env</module> modülünü
474 çalıştıracak ve başarılı olunduğu takdirde içeriği onsuz teslim
475 edecektir. Bu durumda arabellek kaybı <code>1</code> olarak
476 günlüklenirken arabellek sunumu <code>-</code> olarak
477 günlüklenecektir.</p>
479 <p><code>env=</code> sözdizimine ek olarak, <directive
480 module="mod_log_config">LogFormat</directive> HTTP yanıt kodudaki koşul
481 değerlerini günlüklemeyi de destekler:</p>
484 LogFormat "%400,501{User-agent}i" browserlog<br />
485 LogFormat "%!200,304,302{Referer}i" refererlog
488 <p>Bu örnekte, HTTP durum kodu 400 veya 501 ise <code>User-agent</code>
489 başlığı günlüklenecektir. Aksi takdirde, günlüğe bir "-" yazılacaktır.
490 Benzer şekilde ikinci örnekte, HTTP durum kodu 200, 204 veya 302
491 <strong>değilse</strong> (durum kodlarının öncesindeki "!" imine
492 dikkat) <code>Referer</code> başlığı günlüklenecektir.</p>
494 <p>Koşulaa bağlı günlük kaydının çok esnek ve güçlü olabileceğini
495 göstermiş olsak da günlük içeriğini denetlemenin tek yolu bu değildir.
496 Günlük dosyaları sunucu etkinliğini eksiksiz olarak kaydedebildikleri
497 takdirde daha yararlı olurlar. Günlük dosyalarını sonradan işleme tabi
498 tutarak istenmeyen girdileri kaldırılmış bir kopya almak hem kolay hem
499 de daha yararlıdır.</p>
503 <section id="rotation">
504 <title>Günlük Çevrimi</title>
506 <p>Yükü ağır sunucularda günlük dosyalarına kaydedilen bilginin miktarı
507 çok büyük boyutlara ulaşabilir. 10.000 istek içeren bir erişim günlüğü
508 yaklaşık 1MB yer kaplar. Etkin günlük dosyasını belirli aralıklarla
509 değiştirmek veya silmek gerekebilir. Apache httpd çalışırken dosyayı sürekli
510 açık tuttuğu ve yazdığı için bu işlem sunucu çalışırken yapılamaz. Bu
511 bakımdan, günlük dosyası değiştirildikten veya silindikten sonra yeni
512 dosyanın açılması için <a href="stopping.html">sunucunun yeniden
513 başlatılması</a> gerekir.</p>
515 <p><a href="stopping.html#graceful">Nazikçe yeniden başlatmak</a>
516 suretiyle sunucunun, mevcut ve bekleyen bağlantıları kaybetmeden yeni
517 günlük dosyalarını açması sağlanabilir. Bununla birlikte, bu işlem
518 sırasında sunucunun eski isteklere sunumu bitirene kadar eski günlük
519 dosyalarına yazmaya devam edebilmesi gerekir. Bu bakımdan, yeniden
520 başlatmanın ardından eski günlük dosyaları üzerinde bir işlem yapmadan
521 önce biraz beklemek gerekir. Günlük dosyalarını döndürürken kullanılan
522 senaryolarda genellikle eski günlük dosyaları yer kazanmak için
526 mv access_log access_log.old<br />
527 mv error_log error_log.old<br />
528 apachectl graceful<br />
530 gzip access_log.old error_log.old
533 <p>Günlük çevrimi yapmanın başka bir yolu da sonraki bölümde açıklandığı
534 gibi <a href="#piped">borulu günlükler</a> kullanmaktır.</p>
538 <title>Borulu Günlükler</title>
540 <p>Apache httpd hata ve erişim günlüklerini doğrudan bir dosyaya yazmak
541 yerine bir boru üzerinden başka bir sürece yazabilir. Bu yetenek ana
542 sunucuya herhangi bir kod eklemeksizin günlükleme esnekliğini şaşırtıcı
543 derecede arttırır. Günlükler boruya yazılmak istenirse dosya ismini boru
544 karakteriyle ("<code>|</code>") değiştirip ardına günlük girdilerini
545 standart girdisinden kabul edecek programın ismini eklemek yeterlidir.
546 Apache httpd başlatıldığı zaman borulu günlük işlemini de
547 başlatacaktır. Eğer sunucu çalışırken günlükleri kabul eden süreç
548 çökerse Apache httpd bu programı yeniden başlatır. (Bu son özelliği
549 sebebiyle bu tekniğe “güvenilir borulu günlükleme” adını veriyoruz.)</p>
551 <p>Borulu günlük süreçleri ana Apache httpd süreci tarafından başlatılır
552 ve bu süreçler ana Apache httpd sürecinin kullanıcı kimliğini miras
553 alırlar. Yani borulu günlükleme programları aslında root tarafından
554 çalıştırılmış gibi olur. Bu bakımdan, bu programları basit ve güvenilir
555 kılmak çok önemlidir.</p>
557 <p>Borulu günlüklerin önemli kullanım alanlarından biri de sunucuyu
558 yeniden başlatmak gerekmeksizin günlük çevrimini mümkün kılmaktır.
559 Apache HTTP sunucusu bu amaçla kullanılmak üzere
560 <program>rotatelogs</program> diye bir program içerir. Örneğin,
561 günlükleri 24 saatte bir döndürmek isterseniz bunu şöyle
565 CustomLog "|/usr/local/apache/bin/rotatelogs
566 /var/log/access_log 86400" common
569 <p>Borunun diğer ucundaki süreci başlatacak komutun tırnak içine
570 alındığına dikkat ediniz. Bu örnekler erişim günlüğü için verilmişse de
571 aynı teknik hata günlüğü için de kullanılabilir.</p>
573 <p>Hariçten bir uygulama olarak <a
574 href="http://www.cronolog.org/">cronolog</a> isminde buna benzer ancak
575 çok daha esnek bir program daha vardır.</p>
577 <p>Borulu günlükler de şarta bağlı günlükleme kadar güçlü olmakla beraber
578 çevrimdışı ardıl işlemler gibi daha basit çözümler için
579 kullanılmamalıdır.</p>
581 <p>Öntanımlı olarak borulu günlük süreci bir kabuk kullanmadan
582 çalıştırılır. Kabuk kullanarak (genelde <code>/bin/sh -c</code> ile)
583 yapılmak istenirse "<code>|</code>" yerine "<code>|$</code>"
587 # Kabu kullanarak "rotatelogs" çalıştırmak<br />
588 CustomLog "|$/usr/local/apache/bin/rotatelogs
589 /var/log/access_log 86400" common
592 <p>Bu, Apache 2.2 için öntanımlı davranıştı. Kabuk özelliklerine bağlı
593 olarak, yeniden başlatma sırasındaki sinyal işleme sorunları ve günlük
594 borulama uygulamasının yaşam süresi için ek bir kabuk süreci ile
595 sonuçlanabilir. Apache 2.2 ile uyumluluk açısından "<code>||</code>"
596 gösterimi de desteklenmekte olup "<code>|</code>" kullanımına
601 <section id="virtualhost">
602 <title>Sanal Konaklar</title>
604 <p>Bir sunucu çok sayıda <a href="vhosts/">sanal konak</a> ile hizmet
605 sunarken bunların günlük kayıtları için çeşitli seçenekler mevcuttur.
606 İlk seçenekte, sanki sunucu tek bir konakla hizmet sunuyormuş gibi
607 günlük kaydı yapılır. Günlükleme yönergelerini <directive module="core"
608 type="section">VirtualHost</directive> bölümlerinin dışına, ana sunucu
609 bağlamına yerleştirerek tüm isteklerin aynı erişim ve hata günlüğüne
610 yazılmasını sağlamak olasıdır. Bu teknik, tek tek sanal konaklar için
611 kolayca istatistik toplamaya izin vermez.</p>
613 <p>Eğer <directive module="mod_log_config">CustomLog</directive>
614 veya <directive module="core">ErrorLog</directive> yönergesi bir
615 <directive module="core" type="section">VirtualHost</directive> bölümüne
616 yerleştirilirse bu sanal konağa bütün erişimler veya hatalar belirtilen
617 dosyaya günlüklenecektir. Böyle günlükleme yönergeleri içermeyen sanal
618 konakların günlükleri hala ana sunucunun hata ve erişim günlüklerine
619 yazılmaya devam edecektir. Bu teknik az sayıda sanal konak barındıran
620 sunucular için çok kullanışlıdır. Fakat sanal konak sayısı çok fazlaysa
621 bu teknikle günlük dosyalarını yönetmek çok karmaşık bir hal alabilir.
622 Ayrıca, <a href="vhosts/fd-limits.html">yetersiz dosya tanıtıcısı</a>
623 sorunlarıyla çok sık karşılaşılabilir.</p>
625 <p>Erişim günlükleri için çok az bir fedakarlıkla çok iyi bir çözüm vardır.
626 Günlük biçemine sanal konaklarla ilgili bilgi eklemek suretiyle tüm
627 konakların aynı günlük dosyasını kullanmaları olasıdır. Böylece günlük
628 dosyası sonradan her sanal konak için ayrı bir dosya oluşturmak üzere
629 ayrıştırılabilir. Örneğin, bu işlem için şu yönergeler kullanılıyor
633 LogFormat "%v %l %u %t \"%r\" %>s %b"
635 CustomLog logs/access_log ortaksankon
638 <p><code>%v</code> belirteci isteği sunan sanal konağın ismini günlüğe
639 yazmak için kullanılır. Daha sonra <a
640 href="programs/other.html">split-logfile</a> gibi bir program
641 kullanarak, bu dosyadan her sanal konak için ayrı birer dosya elde
646 <title>Diğer Günlük Dosyaları</title>
650 <module>mod_logio</module>
651 <module>mod_log_config</module>
652 <module>mod_log_forensic</module>
653 <module>mod_cgi</module>
657 <directive module="mod_log_config">LogFormat</directive>
658 <directive module="mod_log_config">BufferedLogs</directive>
659 <directive module="mod_log_forensic">ForensicLog</directive>
660 <directive module="mpm_common">PidFile</directive>
661 <directive module="mod_cgi">ScriptLog</directive>
662 <directive module="mod_cgi">ScriptLogBuffer</directive>
663 <directive module="mod_cgi">ScriptLogLength</directive>
668 <title>Gönderilen ve alınan bayt sayısının günlüklenmesi</title>
670 <p><module>mod_logio</module> modülü <directive
671 module="mod_log_config">LogFormat</directive> yönergesinde kullanılan
672 biçem belirteçlerine alınan ve gönderilen bayt sayıları için iki
673 belirteç (%I ve %O) ekler.</p>
677 <title>Adli Günlük</title>
679 <p><module>mod_log_forensic</module> modülü istemci isteklerinin kanıt
680 olarak kullanılmak amacıyla günlüklenmesini sağlar. Günlükleme her
681 istek için isteğe hizmet sunmadan önce ve sonra olmak üzere iki defa
682 yapılır. Böylece günlük dosyasında başarılı her istek için iki satır
683 bulunur. Adli günlükleme çok sıkı kurallara tabi olup
684 kişiselleştirilemez. Güvenlik ve hata ayıklama aracı olarak yararlı
688 <section id="pidfile">
689 <title>PID Dosyası</title>
691 <p>Apache httpd başlatıldığında, ana httpd sürecinin kimliği (PID)
692 <code>logs/httpd.pid</code> dosyasına kaydedilir. Bu dosyanın ismi
693 <directive module="mpm_common">PidFile</directive> yönergesi ile
694 değiştirilebilir. Bu süreç kimliği sistem yöneticisi tarafından ana
695 sürece sinyal göndererek artalan sürecini sonlandırmak veya yeniden
696 başlatmak için kullanılır. Windows üzerinde bu işlem için
697 <code>-k</code> komut satırı seçeneği kullanılır. Bu konuda daha
698 ayrıntılı bilgi edinmek için <a href="stopping.html">Durdurma ve
699 Yeniden Başlatma</a> belgesine bakınız.</p>
702 <section id="scriptlog">
703 <title>Betik Günlüğü</title>
705 <p><directive module="mod_cgi">ScriptLog</directive> yönergesi CGI
706 betiklerinin girdi ve çıktılarını kaydetmenizi mümkün kılmak suretiyle
707 hata ayıklamaya yardımcı olur. Bu sadece deneysel amaçla kullanılmalı,
708 asıl sunucuya uygulanmamalıdır. <a href="mod/mod_cgi.html">mod_cgi</a>
709 belgesinde daha fazla bilgi bulunabilir.</p>