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.
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.
Bu belgede Apache HTTP Sunucusunun standart parçası olan günlükleme modülleri hakkında bilgi verilecektir.
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 hiç kimseye yazma erişimi vermeyin; ayrıntılı bilgi için güvenlik ipuçları belgesine bakınız.
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.
İsmi ve yeri 
Hata günlüğü normal olarak bir dosyaya yazılır (genellikle, dosyanın
      ismi Unix sistemlerinde error_log, OS/2 ve Windows’ta ise
      error.log’dur). Ayrıca, Unix sistemlerinde sunucunun
      hataları syslog’a veya borulamak suretiyle
      bir programa aktarması da mümkündür.
Hata günlüğünün biçemi 
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ş).
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 (stderr) yazılan her türlü bilgi doğrudan hata
      günlüğüne kopyalanır.
Hata günlüğüne ve erişim günlüğüne  %L 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.
      
Sunucuyu denerken olası sorunlara karşı hata günlüğünü sürekli izlemelisiniz. Unix sistemlerinde bunu şöyle bir komutla sağlayabilirsiniz:
Bunu 
Bu satırla ana trace5 seviyesine
      kadar açılmaktadır.
RewriteLog gibi günlükleme modüllerinin yerini almıştır.
    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  
Şü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 dmoz.org veya Yahoo’ya bakınız.
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 TransferLog yönergesi
      sayılabilir. Artık, daha eski tüm diğer yönergelerin işlevselliklerini
      bir araya toplayan 
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 
Erişim günlüğü için sıklıkla kullanılan bir yapılandırma:
İlk satırda belli bir biçem dizgesi için common diye bir
        takma ad 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
        "\n" ve sekmeleri belirtmek için "\t"
        denetim karakterlerini de içerebilir.
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:
Bu günlük girdisini parça parça açıklayalım:
127.0.0.1 (%h)On 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 - (%l)identd 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,
          On değeri atanmış olmadıkça bu bilgiyi saptamaya
          uğraşmaz.frank (%u)REMOTE_USER 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
          "-" olacaktır.[10/Oct/2000:13:55:36 -0700]
        (%t)
            [gün/ay/yıl:saat:dakika:saniye dilim]
          
             gün    = 2 hane
             ay     = 3 harf
             yıl    = 4 hane
             saat   = 2 hane
             dakika = 2 hane
             saniye = 2 hane
             dilim  = (`+' | `-') 4 hane
Günlük biçem dizgesinde zaman gösterim biçemini
          %{biçem}t şeklinde belirtmek de mümkündür.
          Buradaki biçem dizgesi, stardart C
          kütüphanesindeki strftime(3) işlevi için tanımlanmış
          biçem belirteçleriyle veya desteklenen özel belirteçlerle
          oluşturulabilir. Ayrıntılı bilgi için 
"GET /apache_pb.gif HTTP/1.0"
        (\"%r\")GET’miş. İkinci olarak istemci
          /apache_pb.gif dosyasını istemiş ve üçüncü olarak
          istemci HTTP/1.0 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,
          "%m %U%q %H" dizgesi, yöntem, yol, sorgu dizgesi ve
          protokolü kaydedecektir; bu dizge "%r" biçem
          belirtecinin tek başına yaptığı işi yapar.200 (%>s)2326 (%b)-" olacaktır. Bunun yerine günlüğe "0"
          yazdırmak için %B belirtecini kullanınız.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:
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 %{başlık}i
        biçeminde olup buradaki başlık, HTTP isteğindeki
        başlık alanlarından biridir. Bu biçemin kullanıldığı bir erişim
        günlüğü girdisi şöyle olurdu:
Ek alanlar:
"http://www.example.com/start.html"
        (\"%{Referer}i\")"Mozilla/4.08 [en] (Win98; I ;Nav)"
        (\"%{User-agent}i\")Yapılandırma dosyasında çok sayıda ReferLog ve
        AgentLog yönergelerinin etkilerinin nasıl taklit
        edileceğini de göstermektedir.
Bu örnek ayrıca, 
Bazı durumlarda istemcinin yaptığı isteğe bağlı olarak erişim
        günlüğünde belli girdilerin dışlanması gerekebilir. Bu, ortam değişkenleri 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 env= deyimi kullanılarak belirtilir. Bazı örnekler:
Başka bir örnek olarak, Türkçe belge isteklerini bir dosyaya diğer dillerdeki istekleri başka bir dosyaya kaydedelim.
Bir arabellkleme senaryosuna arabelleğin verimli kullanılıp kullanılmadığını bilmek isteyelim. Bu basitçe şöyle yapılabilir:
1 olarak
        günlüklenirken arabellek sunumu - olarak
        günlüklenecektir.
env= sözdizimine ek olarak, 
Bu örnekte, HTTP durum kodu 400 veya 501 ise User-agent
        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
        değilse (durum kodlarının öncesindeki "!" imine
        dikkat) Referer başlığı günlüklenecektir.
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.
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 sunucunun yeniden başlatılması gerekir.
Nazikçe yeniden başlatmak 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:
Günlük çevrimi yapmanın başka bir yolu da sonraki bölümde açıklandığı gibi borulu günlükler kullanmaktır.
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 ("|") 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.)
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.
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
      
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.
Hariçten bir uygulama olarak cronolog isminde buna benzer ancak çok daha esnek bir program daha vardır.
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.
Öntanımlı olarak borulu günlük süreci bir kabuk kullanmadan
      çalıştırılır. Kabuk kullanarak (genelde /bin/sh -c ile)
      yapılmak istenirse "|" yerine "|$"
      kullanılır:
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 "||"
      gösterimi de desteklenmekte olup "|" kullanımına
      eşdeğerdir.
Bir sunucu çok sayıda sanal konak 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 
Eğer  
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:
%v belirteci isteği sunan sanal konağın ismini günlüğe
      yazmak için kullanılır. Daha sonra split-logfile gibi bir program
      kullanarak, bu dosyadan her sanal konak için ayrı birer dosya elde
      edilebilir.
Apache httpd başlatıldığında, ana httpd sürecinin kimliği (PID)
        logs/httpd.pid dosyasına kaydedilir. Bu dosyanın ismi
        -k komut satırı seçeneği kullanılır. Bu konuda daha
        ayrıntılı bilgi edinmek için Durdurma ve
        Yeniden Başlatma belgesine bakınız.