mirror of
https://github.com/apache/httpd.git
synced 2025-08-13 14:40:20 +00:00

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1897340 13f79535-47bb-0310-9956-ffa450edef68
712 lines
34 KiB
XML
712 lines
34 KiB
XML
<?xml version="1.0" encoding="UTF-8" ?>
|
||
<!DOCTYPE manualpage SYSTEM "./style/manualpage.dtd">
|
||
<?xml-stylesheet type="text/xsl" href="./style/manual.tr.xsl"?>
|
||
<!-- English Revision: 1300924:1897300 (outdated) -->
|
||
<!-- =====================================================
|
||
Translated by: Nilgün Belma Bugüner <nilgun belgeler.org>
|
||
Reviewed by: Orhan Berent <berent belgeler.org>
|
||
========================================================== -->
|
||
|
||
<!--
|
||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||
contributor license agreements. See the NOTICE file distributed with
|
||
this work for additional information regarding copyright ownership.
|
||
The ASF licenses this file to You under the Apache License, Version 2.0
|
||
(the "License"); you may not use this file except in compliance with
|
||
the License. You may obtain a copy of the License at
|
||
|
||
http://www.apache.org/licenses/LICENSE-2.0
|
||
|
||
Unless required by applicable law or agreed to in writing, software
|
||
distributed under the License is distributed on an "AS IS" BASIS,
|
||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
See the License for the specific language governing permissions and
|
||
limitations under the License.
|
||
-->
|
||
|
||
<manualpage metafile="logs.xml.meta">
|
||
|
||
<title>Günlük Dosyaları</title>
|
||
|
||
<summary>
|
||
<p>Bir HTTP sunucusunu verimli şekilde yönetebilmek için oluşabilecek
|
||
sorunlardan başka sunucunun başarımı ve etkinliği hakkında da bazı geri
|
||
bildirimler almak gerekir. Apache HTTP Sunucusu çok kapsamlı ve esnek
|
||
bir günlükleme yeteneğine sahiptir. Bu belgede sunucunun günlükleme
|
||
yeteneğini nasıl yapılandıracağınızdan ve günlük kayıtlarını nasıl
|
||
yorumlayacağınızdan bahsedilecektir.</p>
|
||
</summary>
|
||
|
||
<section id="overview">
|
||
<title>Giriş</title>
|
||
|
||
<related>
|
||
<modulelist>
|
||
<module>mod_log_config</module>
|
||
<module>mod_log_forensic</module>
|
||
<module>mod_logio</module>
|
||
<module>mod_cgi</module>
|
||
</modulelist>
|
||
</related>
|
||
|
||
<p>Apache HTTP Sunucusu, isteğin ilk alınışından itibaren, URL eşleme
|
||
işlemleri, bağlantının son çözümlemesi ve bu işlemler sırasına ortaya çıkan
|
||
hatalar da dahil olmak üzere sunucunuzda meydana gelen herşeyi günlüklemek
|
||
için çok çeşitli mekanizmalar içerir. Buna ek olarak, günlükleme
|
||
yetenekleri sağlayan üçüncü parti modüller de kullanılabilir veya mevcut
|
||
günlük dosyalarına girdiler enjekte edilebilir. Ayrıca, CGI programları,
|
||
PHP betikleri ve benzerleri sunucu hata günlüğüne kendi iletilerini
|
||
gönderebilirler.</p>
|
||
|
||
<p>Bu belgede Apache HTTP Sunucusunun standart parçası olan günlükleme
|
||
modülleri hakkında bilgi verilecektir.</p>
|
||
|
||
</section>
|
||
|
||
<section id="security">
|
||
<title>Güvenlik Uyarısı</title>
|
||
|
||
<p>Apache httpd’nin günlük dosyalarını yazdığı dizine yazabilen birinin sunucuyu
|
||
başlatan kullanıcı kimliğine (bu genellikle root olur) erişim
|
||
kazanabileceğine hemen hemen kesin gözüyle bakılabilir. Sonuçlarının
|
||
neler olacağını kestiremiyorsanız günlüklerin yazıldığı dizinde <em>hiç
|
||
kimseye</em> yazma erişimi vermeyin; ayrıntılı bilgi için <a
|
||
href="misc/security_tips.html">güvenlik ipuçları</a> belgesine
|
||
bakınız.</p>
|
||
|
||
<p>Buna ilaveten, günlük dosyaları istemci tarafından sağlanmış bilgiler
|
||
de içerebilir. Bu nedenle, kötü niyetli istemcilerin günlük dosyalarına
|
||
denetim karakterleri girmeleri olasılığına karşı ham günlükler ele
|
||
alınırken dikkatli olunmalıdır.</p>
|
||
</section>
|
||
|
||
<section id="errorlog">
|
||
<title>Hata Günlüğü</title>
|
||
<related>
|
||
<modulelist>
|
||
<module>core</module>
|
||
</modulelist>
|
||
<directivelist>
|
||
<directive module="core">ErrorLog</directive>
|
||
<directive module="core">ErrorLogFormat</directive>
|
||
<directive module="core">LogLevel</directive>
|
||
</directivelist>
|
||
</related>
|
||
|
||
<p>İsmi ve yeri <directive module="core">ErrorLog</directive> yönergesi
|
||
ile belirtilen sunucu hata günlüğü, en önemli günlük dosyasıdır. Apache
|
||
httpd tarafından istekler işlenirken saptanan hatalar ve tanı bilgileri
|
||
bu dosyaya gönderilir. Sunucuyu başlatırken veya sunucu çalışırken bir
|
||
sorunla karşılaşıldığında, neyin yanlış gittiğini öğrenmek için
|
||
bakılacak ilk yer burasıdır. Günlük kaydı çoğunlukla sorunun nasıl
|
||
düzeltileceği ile ilgili ayrıntıları da içerir.</p>
|
||
|
||
<p>Hata günlüğü normal olarak bir dosyaya yazılır (genellikle, dosyanın
|
||
ismi Unix sistemlerinde <code>error_log</code>, OS/2 ve Windows’ta ise
|
||
<code>error.log</code>’dur). Ayrıca, Unix sistemlerinde sunucunun
|
||
hataları <code>syslog</code>’a veya <a href="#piped">borulamak suretiyle
|
||
bir programa</a> aktarması da mümkündür.</p>
|
||
|
||
<p>Hata günlüğünün biçemi <directive module="core"
|
||
>ErrorLogFormat</directive> yönergesi ile belirlenir. Bu yönergeyi
|
||
kullanarak günlüklenen değerleri özelleştirebilirsiniz. Bir biçem
|
||
belirtmezseniz öntanımlı biçem kullanılır. Örnek tipik bir hata iletisi
|
||
içermektedir:</p>
|
||
|
||
<example>
|
||
[Fri Sep 09 10:42:29.902022 2011] [core:error] [pid 35708:tid 4328636416]
|
||
[client 72.15.99.187] Dosya yok: /usr/local/apache2/htdocs/favicon.ico
|
||
</example>
|
||
|
||
<p>Günlük girdisinin ilk öğesi iletinin yazıldığı tarih ve saatten oluşur.
|
||
İkincisi iletiyi üreten modülün ismi (bu durumda: core) ile raporlanan
|
||
bilginin önem derecesini belirtir. Bunu varsa sürecin kimliği ve yine
|
||
varsa evre kimliği izler. Sonraki öğe hatanın üretilmesine sebep olan
|
||
istemcinin IP adresini içerir. Kalanı iletinin kendisidir (duruma
|
||
bakılırsa bir dosyaya yapılan istek yerine getirilememiş).</p>
|
||
|
||
<p>Hata günlüğünde görünebilecek ileti çeşitliliği oldukça fazladır. Çoğu
|
||
yukarıdaki örneğin benzeridir. Hata günlüğü ayrıca, CGI betiklerinin
|
||
hata ayıklama çıktılarını da içerir. Bir CGI betiği tarafından standart
|
||
hataya (<code>stderr</code>) yazılan her türlü bilgi doğrudan hata
|
||
günlüğüne kopyalanır.</p>
|
||
|
||
<p>Hata günlüğüne ve erişim günlüğüne <code>%L</code> dizgeciği konularak
|
||
erişim günlüğündeki girdi ile hata günlüğündeki girdiyi ilişkilendirecek
|
||
bir günlük girdisi kimliği oluşturulabilir.
|
||
<module>mod_unique_id</module> yüklüyse günlük girdisi kimliği olarak
|
||
onun eşsiz istek kimliği de kullanılır.</p>
|
||
|
||
<p>Sunucuyu denerken olası sorunlara karşı hata günlüğünü sürekli
|
||
izlemelisiniz. Unix sistemlerinde bunu şöyle bir komutla
|
||
sağlayabilirsiniz:</p>
|
||
|
||
<example>
|
||
tail -f error_log
|
||
</example>
|
||
</section>
|
||
|
||
<section id="permodule">
|
||
<title>Modüllere göre günlükleme</title>
|
||
|
||
<p><directive module="core">LogLevel</directive> yönergesi, günlük
|
||
iletisinin üretilmesine sebep olan modüle bağlı bir önem seviyesi
|
||
belirleyebilmenizi sağlar. Bu yolla sorun yaşadığınız modülle ilgili
|
||
günlük musluklarını sonuna kadar açabiliri ek olarak ilgilendiğiniz diğer
|
||
modüllerle ilgili ayrıntıları da edinebilirsiniz. Özellikle
|
||
<module>mod_proxy</module> veya <module>mod_rewrite</module> gibi
|
||
modüllerde yapılmak isteneni denerken neler olup bittiğini ayrıntılarıyla
|
||
bilmek istediğiniz durumlarda kullanışlıdır.</p>
|
||
|
||
<p>Bunu <directive>LogLevel</directive> yönergesinde modülün ismini
|
||
belirterek yapabilirsiniz:</p>
|
||
|
||
<example>
|
||
LogLevel info rewrite:trace5
|
||
</example>
|
||
|
||
<p>Bu satırla ana <directive>LogLevel</directive> info'ya ayarlanırken
|
||
<module>mod_rewrite</module> için musluk <code>trace5</code> seviyesine
|
||
kadar açılmaktadır.</p>
|
||
|
||
<note>Bu yönerge, Apache HTTP Sunucusunun evvelki sürümlerinde mevcut olan
|
||
<code>RewriteLog</code> gibi günlükleme modüllerinin yerini almıştır.
|
||
</note>
|
||
</section>
|
||
|
||
<section id="accesslog">
|
||
<title>Erişim Günlüğü</title>
|
||
|
||
<related>
|
||
<modulelist>
|
||
<module>mod_log_config</module>
|
||
<module>mod_setenvif</module>
|
||
</modulelist>
|
||
<directivelist>
|
||
<directive module="mod_log_config">CustomLog</directive>
|
||
<directive module="mod_log_config">LogFormat</directive>
|
||
<directive module="mod_setenvif">SetEnvIf</directive>
|
||
</directivelist>
|
||
</related>
|
||
|
||
<p>Sunucu erişim günlüğü sunucu tarafından işleme alınan tüm istekleri
|
||
kaydeder. Erişim günlüğünün yeri ve içeriği <directive
|
||
module="mod_log_config">CustomLog</directive> yönergesi ile belirlenir.
|
||
<directive module="mod_log_config">LogFormat</directive> yönergesi ile
|
||
günlük içeriğini kişiselleştirmek mümkündür. Bu bölümde sunucunun
|
||
bilgileri erişim günlüğüne kaydetmesi için nasıl yapılandırılacağından
|
||
bahsedilecektir.</p>
|
||
|
||
<p>Şüphesiz, bilginin erişim günlüğünde saklanması günlük yönetiminde ilk
|
||
adımı oluşturur. Sonraki adım yararlı istatistikleri üretmek için bu
|
||
bilgiyi incelemektir. Günlük incelemesi bu belgenin kapsamına dahil
|
||
değildir ve aslında bu işlem sunucunun yaptığı işlerden biri değildir.
|
||
Bu konu ve günlük incelemesi yapan uygulamalar hakkında daha ayrıntılı
|
||
bilgi edinmek için <a
|
||
href="http://dmoz.org/Computers/Software/Internet/Site_Management/Log_analysis/"
|
||
>dmoz.org</a>
|
||
bakınız.</p>
|
||
|
||
<p>Apache httpd’nin çeşitli sürümlerinde erişim günlüklerini denetlemek
|
||
için kullanılan diğer modüller ve yönergeler arasında mod_log_referer,
|
||
mod_log_agent modülleri ve <code>TransferLog</code> yönergesi
|
||
sayılabilir. Artık, daha eski tüm diğer yönergelerin işlevselliklerini
|
||
bir araya toplayan <directive module="mod_log_config"
|
||
>CustomLog</directive> yönergesi kullanılmaktadır.</p>
|
||
|
||
<p>Erişim günlüğünün girdi biçemi kolayca isteğe göre
|
||
düzenlenebilmektedir. Biçemi belirtmekte kullanılan biçem dizgesi, C
|
||
tarzı printf(1) biçem dizgesini andırır. Sonraki bölümlerde bazı
|
||
örneklere yer verilmiştir. Biçem dizgesini oluşturan belirteçlerin tam
|
||
listesi için <module>mod_log_config</module> belgesinin <a
|
||
href="mod/mod_log_config.html#formats">Günlük Girdilerinin
|
||
Kişiselleştirilmesi</a> bölümüne bakınız.</p>
|
||
|
||
<section id="common">
|
||
<title>Ortak Günlük Biçemi (OGB)</title>
|
||
|
||
<p>Erişim günlüğü için sıklıkla kullanılan bir yapılandırma:</p>
|
||
|
||
<example>
|
||
LogFormat "%h %l %u %t \"%r\" %>s %b" common<br />
|
||
CustomLog logs/access_log common
|
||
</example>
|
||
|
||
<p>İlk satırda belli bir biçem dizgesi için <code>common</code> diye bir
|
||
<em>takma ad</em> tanımlanmaktadır. Biçem dizgesi, sunucuya hangi
|
||
belli bir bilgi parçalarını günlükleyeceğini söyleyen % imli biçem
|
||
belirteçlerinden oluşur. Biçem dizgesine ayrıca dizgesel sabitler de
|
||
yerleştirilebilir ve bunlar erişim günlüğüne oldukları gibi
|
||
kopyalanırlar. Biçem dizgesi içinde çift tırnak karakteri (") biçem
|
||
dizgesini vaktinden önce sonlandırmaması için ters bölü çizgisi ile
|
||
öncelenmelidir. Biçem dizgesi ayrıca, satır sonlarını belirtmek için
|
||
"<code>\n</code>" ve sekmeleri belirtmek için "<code>\t</code>"
|
||
denetim karakterlerini de içerebilir.</p>
|
||
|
||
<p><directive module="mod_log_config">CustomLog</directive> yönergesi
|
||
evvelce tanımlanmış bir <em>takma adı</em> kullanarak yeni bir günlük
|
||
dosyası tanımlar. Erişim günlüğünün dosya ismi bölü çizgisi ile
|
||
başlamadıkça dosya yolunun <directive module="core"
|
||
>ServerRoot</directive> değerine göreli olduğu varsayılır.</p>
|
||
|
||
<p>Yukarıdaki yapılandırma günlük dosyasına girdileri Ortak Günlük
|
||
Biçemi (Common Log Format) adı verilen standart biçemde yazar.
|
||
Bu standart biçem başka HTTP sunucuları tarafından da kullanılır ve
|
||
çoğu günlük inceleme yazılımı tarafından tanınır. Ortak Günlük
|
||
Biçeminde üretilen günlük girdileri şöyle görünür:</p>
|
||
|
||
<example>
|
||
127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET
|
||
/apache_pb.gif HTTP/1.0" 200 2326
|
||
</example>
|
||
|
||
<p>Bu günlük girdisini parça parça açıklayalım:</p>
|
||
|
||
<dl>
|
||
<dt><code>127.0.0.1</code> (<code>%h</code>)</dt>
|
||
|
||
<dd>Bu, sunucuya istek yapan istemcinin (uzak konağın) IP adresidir.
|
||
Eğer <directive module="core">HostnameLookups</directive>
|
||
yönergesine <code>On</code> değeri atanmışsa sunucu bu IP adresi
|
||
için DNS sorgusu yapacak ve IP adresi yerine bulduğu konak ismini
|
||
yazmaya çalışacaktır. Bununla birlikte, bu işlem sunucuyu epeyce
|
||
yavaşlattığından önerilmemektedir. Konak isimlerini saptamak için en
|
||
iyisi günlük girdilerini <program>logresolve</program> gibi bir
|
||
günlük işlemcisinden geçirmektir. Burada raporlanan IP adresi
|
||
doğrudan istemcinin IP adresi olmayabilir. Eğer sunucu ile istemci
|
||
arasında bir vekil sunucu varsa bu IP adresi, vekil sunucunun IP
|
||
adresi olacaktır.</dd>
|
||
|
||
<dt><code>-</code> (<code>%l</code>)</dt>
|
||
|
||
<dd>Çıktıdaki bir "tire" imi istenen bilgi parçasının mevcut olmadığı
|
||
anlamına gelir. Bu durumda, mevcut olmayan bilgi istemci makine
|
||
üzerinde <code>identd</code> tarafından belirlenen istemcinin RFC
|
||
1413 kimliğidir. Bu bilgi oldukça güvenilmezdir ve sıkıca denetlenen
|
||
iç ağlar haricinde hemen hemen asla kullanılmamalıdır. Apache,
|
||
<directive module="mod_ident">IdentityCheck</directive> yönergesine
|
||
<code>On</code> değeri atanmış olmadıkça bu bilgiyi saptamaya
|
||
uğraşmaz.</dd>
|
||
|
||
<dt><code>frank</code> (<code>%u</code>)</dt>
|
||
|
||
<dd>Bu, belge isteğinde bulunan kişinin HTTP kimlik doğrulamasıyla
|
||
saptanan kullanıcı kimliğidir. Bu değer CGI betiklerine
|
||
<code>REMOTE_USER</code> ortam değişkeni ile sağlanır. Eğer istek
|
||
için durum kodu 401 ise (aşağıya bakınız) henüz kullanıcının kimliği
|
||
doğrulanmamış olacağından bu değere güvenilmemelidir. Eğer belge
|
||
parola korumalı değilse günlüğün bu kısmı da yukarıdaki gibi
|
||
"<code>-</code>" olacaktır.</dd>
|
||
|
||
<dt><code>[10/Oct/2000:13:55:36 -0700]</code>
|
||
(<code>%t</code>)</dt>
|
||
|
||
<dd>İsteğin alındığı tarih ve saat. Biçemi şöyledir:
|
||
|
||
<p class="indent">
|
||
<code>[gün/ay/yıl:saat:dakika:saniye dilim]<br />
|
||
gün = 2 hane<br />
|
||
ay = 3 harf<br />
|
||
yıl = 4 hane<br />
|
||
saat = 2 hane<br />
|
||
dakika = 2 hane<br />
|
||
saniye = 2 hane<br />
|
||
dilim = (`+' | `-') 4 hane</code>
|
||
</p>
|
||
<p>Günlük biçem dizgesinde zaman gösterim biçemini
|
||
<code>%{<em>biçem</em>}t</code> şeklinde belirtmek de mümkündür.
|
||
Buradaki <code><em>biçem</em></code> dizgesi, stardart C
|
||
kütüphanesindeki <code>strftime(3)</code> işlevi için tanımlanmış
|
||
biçem belirteçleriyle veya desteklenen özel belirteçlerle
|
||
oluşturulabilir. Ayrıntılı bilgi için <module>mod_log_config</module>
|
||
<a href="mod/mod_log_config.html#formats">biçem dizgelerine</a>
|
||
bakın.</p>
|
||
</dd>
|
||
|
||
<dt><code>"GET /apache_pb.gif HTTP/1.0"</code>
|
||
(<code>\"%r\"</code>)</dt>
|
||
|
||
<dd>İstemciden alınan istek satırının çift tırnaklar arasında
|
||
gösterilmesi istenmiştir. İstek satırı en yararlı bilgi parçalarını
|
||
içerir. Birincisi, istemci tarafından kullanılan yöntem
|
||
<code>GET</code>’miş. İkinci olarak istemci
|
||
<code>/apache_pb.gif</code> dosyasını istemiş ve üçüncü olarak
|
||
istemci <code>HTTP/1.0</code> protokolünü kullanmış. İstek satırının
|
||
bazı parçalarını bağımsız olarak da günlüklemek mümkündür. Örneğin,
|
||
"<code>%m %U%q %H</code>" dizgesi, yöntem, yol, sorgu dizgesi ve
|
||
protokolü kaydedecektir; bu dizge "<code>%r</code>" biçem
|
||
belirtecinin tek başına yaptığı işi yapar.</dd>
|
||
|
||
<dt><code>200</code> (<code>%>s</code>)</dt>
|
||
|
||
<dd>Bu, sunucunun istemciye gönderdiği durum kodudur. İsteğin
|
||
başarıyla yerine getirilip getirilmediğini gösterdiği için bu bilgi
|
||
çok değerlidir. Durum kodu 2 ile başlıyorsa istek başarıyla yerine
|
||
getirilmiştir, 3 ile başlıyorsa yönlendirilmiştir, 4 ile başlıyorsa
|
||
istemci tarafında bir hata oluşmuştur, 5 ile başlıyorsa sunucuda bir
|
||
hata oluşmuştur. Olası hata kodlarının tam listesi <a
|
||
href="http://www.w3.org/Protocols/rfc2616/rfc2616.txt">RFC2616 Hiper
|
||
Metin Aktarım Protokolü</a>nün 10. bölümünde bulunabilir.</dd>
|
||
|
||
<dt><code>2326</code> (<code>%b</code>)</dt>
|
||
|
||
<dd>Son parça istemciye döndürülen nesnenin yanıt başlığı hariç
|
||
uzunluğudur. Eğer istemciye bir içerik döndürülmemişse bu değer
|
||
"<code>-</code>" olacaktır. Bunun yerine günlüğe "<code>0</code>"
|
||
yazdırmak için <code>%B</code> belirtecini kullanınız.</dd>
|
||
</dl>
|
||
</section>
|
||
|
||
<section id="combined">
|
||
<title>Birleşik Günlük Biçemi</title>
|
||
|
||
<p>Sıklıkla kullanılan diğer bir biçem dizgesi Birleşik Günlük Biçemi
|
||
(Combined Log Format) olup şöyle kullanılabilir:</p>
|
||
|
||
<example>
|
||
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\"
|
||
\"%{User-agent}i\"" combined<br />
|
||
CustomLog log/access_log combined
|
||
</example>
|
||
|
||
<p>Bu biçem ilaveten 2 alan içermesi dışında Ortak Günlük Biçemi ile
|
||
aynıdır. İlave alanların ikisi de <code>%{<em>başlık</em>}i</code>
|
||
biçeminde olup buradaki <code><em>başlık</em></code>, HTTP isteğindeki
|
||
başlık alanlarından biridir. Bu biçemin kullanıldığı bir erişim
|
||
günlüğü girdisi şöyle olurdu:</p>
|
||
|
||
<example>
|
||
127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET
|
||
/apache_pb.gif HTTP/1.0" 200 2326
|
||
"http://www.example.com/start.html" "Mozilla/4.08 [en]
|
||
(Win98; I ;Nav)"
|
||
</example>
|
||
|
||
<p>Ek alanlar:</p>
|
||
|
||
<dl>
|
||
<dt><code>"http://www.example.com/start.html"</code>
|
||
(<code>\"%{Referer}i\"</code>)</dt>
|
||
|
||
<dd>HTTP istek başlığı "Referer". İstemcinin raporladığı isteğin
|
||
kaynaklandığı URI. (Bu isteğin yapılmasını sağlayan bağlantıyı
|
||
içeren URL veya istek bir sayfanın bileşenleri ile ilgiliyse istenen
|
||
sayfanın URL’si olabilir.)</dd>
|
||
|
||
<dt><code>"Mozilla/4.08 [en] (Win98; I ;Nav)"</code>
|
||
(<code>\"%{User-agent}i\"</code>)</dt>
|
||
|
||
<dd>Tarayıcı kimliğini içeren HTTP istek başlığı. Bu istemcinin
|
||
tarayıcısının raporladığı kendi tanıtım bilgisidir.</dd>
|
||
</dl>
|
||
</section>
|
||
|
||
<section id="multiple">
|
||
<title>Çok Sayıda Erişim Günlüğü</title>
|
||
|
||
<p>Yapılandırma dosyasında çok sayıda <directive
|
||
module="mod_log_config">CustomLog</directive> yönergesi kullanarak çok
|
||
sayıda erişim günlüğü kolayca oluşturulabilir. Örneğin aşağıdaki
|
||
yönergelerle 3 tane erişim günlüğü oluşturulacaktır. İlki temel OGB
|
||
bilgisini içerirken diğer ikisi isteğin kaynaklandığı yeri ve tarayıcı
|
||
kimliğini içerir. Son iki <directive module="mod_log_config"
|
||
>CustomLog</directive> satırı ayrıca, <code>ReferLog</code> ve
|
||
<code>AgentLog</code> yönergelerinin etkilerinin nasıl taklit
|
||
edileceğini de göstermektedir.</p>
|
||
|
||
<example>
|
||
LogFormat "%h %l %u %t \"%r\" %>s %b" common<br />
|
||
CustomLog logs/access_log common<br />
|
||
CustomLog logs/referer_log "%{Referer}i -> %U"<br />
|
||
CustomLog logs/agent_log "%{User-agent}i"
|
||
</example>
|
||
|
||
<p>Bu örnek ayrıca, <directive module="mod_log_config"
|
||
>LogFormat</directive> yönergesi ile bir takma ad tanımlamanın şart
|
||
olmadığını da göstermektedir. Günlük biçemi doğrudan <directive
|
||
module="mod_log_config">CustomLog</directive> yönergesinde
|
||
belirtilebilir.</p>
|
||
</section>
|
||
|
||
<section id="conditional">
|
||
<title>Şarta Bağlı Günlükler</title>
|
||
|
||
<p>Bazı durumlarda istemcinin yaptığı isteğe bağlı olarak erişim
|
||
günlüğünde belli girdilerin dışlanması gerekebilir. Bu, <a
|
||
href="env.html" >ortam değişkenleri</a> sayesinde kolayca yerine
|
||
getirilebilir. Önce isteğin belli koşulları sağladığını belirten bir
|
||
ortam değişkeni ataması yapılır. Bu işlem <directive
|
||
module="mod_setenvif">SetEnvIf</directive> yönergesi ile yapılır.
|
||
Sonra da, ortam değişkenine bağlı olarak isteklerin günlüğe dahil
|
||
edilip edilmeyeceği <directive
|
||
module="mod_log_config">CustomLog</directive> yönergesinin
|
||
<code>env=</code> deyimi kullanılarak belirtilir. Bazı örnekler:</p>
|
||
|
||
<example>
|
||
# yerel konaktan kaynaklanan istekleri imleyelim<br />
|
||
SetEnvIf Remote_Addr "127\.0\.0\.1" kaydetme<br />
|
||
# robots.txt dosyası isteklerini imleyelim<br />
|
||
SetEnvIf Request_URI "^/robots\.txt$" kaydetme<br />
|
||
# Kalanları günlüğe kaydedelim<br />
|
||
CustomLog logs/access_log common env=!kaydetme
|
||
</example>
|
||
|
||
<p>Başka bir örnek olarak, Türkçe belge isteklerini bir dosyaya diğer
|
||
dillerdeki istekleri başka bir dosyaya kaydedelim.</p>
|
||
|
||
<example>
|
||
SetEnvIf Accept-Language "tr" turkce<br />
|
||
CustomLog logs/turkce_log common env=turkce<br />
|
||
CustomLog logs/diger_diller_log common env=!turkce
|
||
</example>
|
||
|
||
<p>Bir arabellkleme senaryosuna arabelleğin verimli kullanılıp
|
||
kullanılmadığını bilmek isteyelim. Bu basitçe şöyle yapılabilir:</p>
|
||
|
||
<example>
|
||
SetEnv CACHE_MISS 1<br />
|
||
LogFormat "%h %l %u %t "%r " %>s %b %{CACHE_MISS}e" common-cache<br />
|
||
CustomLog logs/access_log common-cache
|
||
</example>
|
||
|
||
<p><module>mod_cache</module> önce <module>mod_env</module> modülünü
|
||
çalıştıracak ve başarılı olunduğu takdirde içeriği onsuz teslim
|
||
edecektir. Bu durumda arabellek kaybı <code>1</code> olarak
|
||
günlüklenirken arabellek sunumu <code>-</code> olarak
|
||
günlüklenecektir.</p>
|
||
|
||
<p><code>env=</code> sözdizimine ek olarak, <directive
|
||
module="mod_log_config">LogFormat</directive> HTTP yanıt kodudaki koşul
|
||
değerlerini günlüklemeyi de destekler:</p>
|
||
|
||
<example>
|
||
LogFormat "%400,501{User-agent}i" browserlog<br />
|
||
LogFormat "%!200,304,302{Referer}i" refererlog
|
||
</example>
|
||
|
||
<p>Bu örnekte, HTTP durum kodu 400 veya 501 ise <code>User-agent</code>
|
||
başlığı günlüklenecektir. Aksi takdirde, günlüğe bir "-" yazılacaktır.
|
||
Benzer şekilde ikinci örnekte, HTTP durum kodu 200, 204 veya 302
|
||
<strong>değilse</strong> (durum kodlarının öncesindeki "!" imine
|
||
dikkat) <code>Referer</code> başlığı günlüklenecektir.</p>
|
||
|
||
<p>Koşulaa bağlı günlük kaydının çok esnek ve güçlü olabileceğini
|
||
göstermiş olsak da günlük içeriğini denetlemenin tek yolu bu değildir.
|
||
Günlük dosyaları sunucu etkinliğini eksiksiz olarak kaydedebildikleri
|
||
takdirde daha yararlı olurlar. Günlük dosyalarını sonradan işleme tabi
|
||
tutarak istenmeyen girdileri kaldırılmış bir kopya almak hem kolay hem
|
||
de daha yararlıdır.</p>
|
||
</section>
|
||
</section>
|
||
|
||
<section id="rotation">
|
||
<title>Günlük Çevrimi</title>
|
||
|
||
<p>Yükü ağır sunucularda günlük dosyalarına kaydedilen bilginin miktarı
|
||
çok büyük boyutlara ulaşabilir. 10.000 istek içeren bir erişim günlüğü
|
||
yaklaşık 1MB yer kaplar. Etkin günlük dosyasını belirli aralıklarla
|
||
değiştirmek veya silmek gerekebilir. Apache httpd çalışırken dosyayı sürekli
|
||
açık tuttuğu ve yazdığı için bu işlem sunucu çalışırken yapılamaz. Bu
|
||
bakımdan, günlük dosyası değiştirildikten veya silindikten sonra yeni
|
||
dosyanın açılması için <a href="stopping.html">sunucunun yeniden
|
||
başlatılması</a> gerekir.</p>
|
||
|
||
<p><a href="stopping.html#graceful">Nazikçe yeniden başlatmak</a>
|
||
suretiyle sunucunun, mevcut ve bekleyen bağlantıları kaybetmeden yeni
|
||
günlük dosyalarını açması sağlanabilir. Bununla birlikte, bu işlem
|
||
sırasında sunucunun eski isteklere sunumu bitirene kadar eski günlük
|
||
dosyalarına yazmaya devam edebilmesi gerekir. Bu bakımdan, yeniden
|
||
başlatmanın ardından eski günlük dosyaları üzerinde bir işlem yapmadan
|
||
önce biraz beklemek gerekir. Günlük dosyalarını döndürürken kullanılan
|
||
senaryolarda genellikle eski günlük dosyaları yer kazanmak için
|
||
sıkıştırılırlar:</p>
|
||
|
||
<example>
|
||
mv access_log access_log.old<br />
|
||
mv error_log error_log.old<br />
|
||
apachectl graceful<br />
|
||
sleep 600<br />
|
||
gzip access_log.old error_log.old
|
||
</example>
|
||
|
||
<p>Günlük çevrimi yapmanın başka bir yolu da sonraki bölümde açıklandığı
|
||
gibi <a href="#piped">borulu günlükler</a> kullanmaktır.</p>
|
||
</section>
|
||
|
||
<section id="piped">
|
||
<title>Borulu Günlükler</title>
|
||
|
||
<p>Apache httpd hata ve erişim günlüklerini doğrudan bir dosyaya yazmak
|
||
yerine bir boru üzerinden başka bir sürece yazabilir. Bu yetenek ana
|
||
sunucuya herhangi bir kod eklemeksizin günlükleme esnekliğini şaşırtıcı
|
||
derecede arttırır. Günlükler boruya yazılmak istenirse dosya ismini boru
|
||
karakteriyle ("<code>|</code>") değiştirip ardına günlük girdilerini
|
||
standart girdisinden kabul edecek programın ismini eklemek yeterlidir.
|
||
Apache httpd başlatıldığı zaman borulu günlük işlemini de
|
||
başlatacaktır. Eğer sunucu çalışırken günlükleri kabul eden süreç
|
||
çökerse Apache httpd bu programı yeniden başlatır. (Bu son özelliği
|
||
sebebiyle bu tekniğe “güvenilir borulu günlükleme” adını veriyoruz.)</p>
|
||
|
||
<p>Borulu günlük süreçleri ana Apache httpd süreci tarafından başlatılır
|
||
ve bu süreçler ana Apache httpd sürecinin kullanıcı kimliğini miras
|
||
alırlar. Yani borulu günlükleme programları aslında root tarafından
|
||
çalıştırılmış gibi olur. Bu bakımdan, bu programları basit ve güvenilir
|
||
kılmak çok önemlidir.</p>
|
||
|
||
<p>Borulu günlüklerin önemli kullanım alanlarından biri de sunucuyu
|
||
yeniden başlatmak gerekmeksizin günlük çevrimini mümkün kılmaktır.
|
||
Apache HTTP sunucusu bu amaçla kullanılmak üzere
|
||
<program>rotatelogs</program> diye bir program içerir. Örneğin,
|
||
günlükleri 24 saatte bir döndürmek isterseniz bunu şöyle
|
||
yapabilirsiniz:</p>
|
||
|
||
<example>
|
||
CustomLog "|/usr/local/apache/bin/rotatelogs
|
||
/var/log/access_log 86400" common
|
||
</example>
|
||
|
||
<p>Borunun diğer ucundaki süreci başlatacak komutun tırnak içine
|
||
alındığına dikkat ediniz. Bu örnekler erişim günlüğü için verilmişse de
|
||
aynı teknik hata günlüğü için de kullanılabilir.</p>
|
||
|
||
<p>Hariçten bir uygulama olarak <a
|
||
href="http://www.cronolog.org/">cronolog</a> isminde buna benzer ancak
|
||
çok daha esnek bir program daha vardır.</p>
|
||
|
||
<p>Borulu günlükler de şarta bağlı günlükleme kadar güçlü olmakla beraber
|
||
çevrimdışı ardıl işlemler gibi daha basit çözümler için
|
||
kullanılmamalıdır.</p>
|
||
|
||
<p>Öntanımlı olarak borulu günlük süreci bir kabuk kullanmadan
|
||
çalıştırılır. Kabuk kullanarak (genelde <code>/bin/sh -c</code> ile)
|
||
yapılmak istenirse "<code>|</code>" yerine "<code>|$</code>"
|
||
kullanılır:</p>
|
||
|
||
<example>
|
||
# Kabu kullanarak "rotatelogs" çalıştırmak<br />
|
||
CustomLog "|$/usr/local/apache/bin/rotatelogs
|
||
/var/log/access_log 86400" common
|
||
</example>
|
||
|
||
<p>Bu, Apache 2.2 için öntanımlı davranıştı. Kabuk özelliklerine bağlı
|
||
olarak, yeniden başlatma sırasındaki sinyal işleme sorunları ve günlük
|
||
borulama uygulamasının yaşam süresi için ek bir kabuk süreci ile
|
||
sonuçlanabilir. Apache 2.2 ile uyumluluk açısından "<code>||</code>"
|
||
gösterimi de desteklenmekte olup "<code>|</code>" kullanımına
|
||
eşdeğerdir.</p>
|
||
|
||
</section>
|
||
|
||
<section id="virtualhost">
|
||
<title>Sanal Konaklar</title>
|
||
|
||
<p>Bir sunucu çok sayıda <a href="vhosts/">sanal konak</a> ile hizmet
|
||
sunarken bunların günlük kayıtları için çeşitli seçenekler mevcuttur.
|
||
İlk seçenekte, sanki sunucu tek bir konakla hizmet sunuyormuş gibi
|
||
günlük kaydı yapılır. Günlükleme yönergelerini <directive module="core"
|
||
type="section">VirtualHost</directive> bölümlerinin dışına, ana sunucu
|
||
bağlamına yerleştirerek tüm isteklerin aynı erişim ve hata günlüğüne
|
||
yazılmasını sağlamak olasıdır. Bu teknik, tek tek sanal konaklar için
|
||
kolayca istatistik toplamaya izin vermez.</p>
|
||
|
||
<p>Eğer <directive module="mod_log_config">CustomLog</directive>
|
||
veya <directive module="core">ErrorLog</directive> yönergesi bir
|
||
<directive module="core" type="section">VirtualHost</directive> bölümüne
|
||
yerleştirilirse bu sanal konağa bütün erişimler veya hatalar belirtilen
|
||
dosyaya günlüklenecektir. Böyle günlükleme yönergeleri içermeyen sanal
|
||
konakların günlükleri hala ana sunucunun hata ve erişim günlüklerine
|
||
yazılmaya devam edecektir. Bu teknik az sayıda sanal konak barındıran
|
||
sunucular için çok kullanışlıdır. Fakat sanal konak sayısı çok fazlaysa
|
||
bu teknikle günlük dosyalarını yönetmek çok karmaşık bir hal alabilir.
|
||
Ayrıca, <a href="vhosts/fd-limits.html">yetersiz dosya tanıtıcısı</a>
|
||
sorunlarıyla çok sık karşılaşılabilir.</p>
|
||
|
||
<p>Erişim günlükleri için çok az bir fedakarlıkla çok iyi bir çözüm vardır.
|
||
Günlük biçemine sanal konaklarla ilgili bilgi eklemek suretiyle tüm
|
||
konakların aynı günlük dosyasını kullanmaları olasıdır. Böylece günlük
|
||
dosyası sonradan her sanal konak için ayrı bir dosya oluşturmak üzere
|
||
ayrıştırılabilir. Örneğin, bu işlem için şu yönergeler kullanılıyor
|
||
olsun:</p>
|
||
|
||
<example>
|
||
LogFormat "%v %l %u %t \"%r\" %>s %b"
|
||
ortaksankon<br />
|
||
CustomLog logs/access_log ortaksankon
|
||
</example>
|
||
|
||
<p><code>%v</code> belirteci isteği sunan sanal konağın ismini günlüğe
|
||
yazmak için kullanılır. Daha sonra <a
|
||
href="programs/other.html">split-logfile</a> gibi bir program
|
||
kullanarak, bu dosyadan her sanal konak için ayrı birer dosya elde
|
||
edilebilir.</p>
|
||
</section>
|
||
|
||
<section id="other">
|
||
<title>Diğer Günlük Dosyaları</title>
|
||
|
||
<related>
|
||
<modulelist>
|
||
<module>mod_logio</module>
|
||
<module>mod_log_config</module>
|
||
<module>mod_log_forensic</module>
|
||
<module>mod_cgi</module>
|
||
</modulelist>
|
||
|
||
<directivelist>
|
||
<directive module="mod_log_config">LogFormat</directive>
|
||
<directive module="mod_log_config">BufferedLogs</directive>
|
||
<directive module="mod_log_forensic">ForensicLog</directive>
|
||
<directive module="mpm_common">PidFile</directive>
|
||
<directive module="mod_cgi">ScriptLog</directive>
|
||
<directive module="mod_cgi">ScriptLogBuffer</directive>
|
||
<directive module="mod_cgi">ScriptLogLength</directive>
|
||
</directivelist>
|
||
</related>
|
||
|
||
<section>
|
||
<title>Gönderilen ve alınan bayt sayısının günlüklenmesi</title>
|
||
|
||
<p><module>mod_logio</module> modülü <directive
|
||
module="mod_log_config">LogFormat</directive> yönergesinde kullanılan
|
||
biçem belirteçlerine alınan ve gönderilen bayt sayıları için iki
|
||
belirteç (%I ve %O) ekler.</p>
|
||
</section>
|
||
|
||
<section>
|
||
<title>Adli Günlük</title>
|
||
|
||
<p><module>mod_log_forensic</module> modülü istemci isteklerinin kanıt
|
||
olarak kullanılmak amacıyla günlüklenmesini sağlar. Günlükleme her
|
||
istek için isteğe hizmet sunmadan önce ve sonra olmak üzere iki defa
|
||
yapılır. Böylece günlük dosyasında başarılı her istek için iki satır
|
||
bulunur. Adli günlükleme çok sıkı kurallara tabi olup
|
||
kişiselleştirilemez. Güvenlik ve hata ayıklama aracı olarak yararlı
|
||
değildir.</p>
|
||
</section>
|
||
|
||
<section id="pidfile">
|
||
<title>PID Dosyası</title>
|
||
|
||
<p>Apache httpd başlatıldığında, ana httpd sürecinin kimliği (PID)
|
||
<code>logs/httpd.pid</code> dosyasına kaydedilir. Bu dosyanın ismi
|
||
<directive module="mpm_common">PidFile</directive> yönergesi ile
|
||
değiştirilebilir. Bu süreç kimliği sistem yöneticisi tarafından ana
|
||
sürece sinyal göndererek artalan sürecini sonlandırmak veya yeniden
|
||
başlatmak için kullanılır. Windows üzerinde bu işlem için
|
||
<code>-k</code> komut satırı seçeneği kullanılır. Bu konuda daha
|
||
ayrıntılı bilgi edinmek için <a href="stopping.html">Durdurma ve
|
||
Yeniden Başlatma</a> belgesine bakınız.</p>
|
||
</section>
|
||
|
||
<section id="scriptlog">
|
||
<title>Betik Günlüğü</title>
|
||
|
||
<p><directive module="mod_cgi">ScriptLog</directive> yönergesi CGI
|
||
betiklerinin girdi ve çıktılarını kaydetmenizi mümkün kılmak suretiyle
|
||
hata ayıklamaya yardımcı olur. Bu sadece deneysel amaçla kullanılmalı,
|
||
asıl sunucuya uygulanmamalıdır. <a href="mod/mod_cgi.html">mod_cgi</a>
|
||
belgesinde daha fazla bilgi bulunabilir.</p>
|
||
</section>
|
||
</section>
|
||
</manualpage>
|