---
title: 'Günlük Mimarisi'
source: 'https://academia.sh/tr/kurslar/sistem-yonetimi/gunluk-mimarisi'
course: 'Sistem Yönetimi'
language: tr
updated: '2026-08-17T18:10:03+00:00'
license: 'CC BY-SA 4.0'
---

# Günlük Mimarisi

Sistem günlüğü ile servis günlükleri arasındaki ayrım: bir kaydın nereden geldiği, hangi düzeyle damgalandığı ve tek bir birim dosyasına bakan tanının kaç kez yanlış çıktığı.

Önceki konu makinenin açılışını baştan sona izledi: ürün yazılımı önyükleyiciyi, önyükleyici
çekirdeği, çekirdek de ilk süreci çağırdı ve servis yöneticisi birimleri bağımlılık sırasına
göre ayağa kaldırdı. O zincirin her adımı bir iş yaptı, ama hiçbiri yaptığı işi operatörün
gözü önünde yapmadı. Makine açıldıktan sonra geriye kalan tek tanık yazılı izdir.

Bu konu o izi ele alır. İlk soru mimaridir: bir satır **günlüğe (log)** nasıl girer, onu kim
damgalar, hangi adrese yazılır ve o adresi açan kişi neyi göremez. Sorunun son parçası
kursun kuralına bağlanır: bir günlüğün değeri kaç satır tuttuğu değil, o satırlardan
çıkarılan tanının kaç kez yanlış çıktığıdır.

Konunun kapsamı tek makinedir. Birden çok makinenin kayıtlarını tek bir yerde toplayan
hatlar, göstergeleri saklayan depolar ve eşik aşıldığında haber veren uyarı zincirleri
Gözlemlenebilirlik ve İşletim ile Güvenlik Operasyonları ve Olay Müdahalesi kurslarında
ölçüldü; burada tekrarlanmaz. Buradaki soru daha önce gelir: makinenin kendi diskinde ve
kendi belleğinde duran kayıt, o makinede ne olduğunu söylemeye yeter mi.

## Günlüğün Üç Kaynağı

Tek bir makinede günlük satırları üç ayrı yerden doğar ve üçü aynı yola girmez.

Birincisi **çekirdektir**. Çekirdek kendi iletilerini bellekte dairesel bir tampona yazar;
tampon dolduğunda en eski satır düşer. Aygıt tanıma, blok aygıtı hatası ve bellek baskısı
uyarıları buradan gelir. Bu tampon disk değildir: yeniden başlatma onu boşaltır, dolayısıyla
bir önceki açılışın çekirdek iletileri kalıcı bir kopya alınmadıysa kayıptır.

İkincisi **servis yöneticisidir**. Bir birim başlatıldığında yöneticinin ona verdiği standart
çıktı ve standart hata birer boru hattıdır; birim o iki akışa ne yazarsa yönetici yakalar,
birim adıyla damgalar ve **sistem günlüğüne (journal)** koyar. Programın günlük yazmak için
özel bir kütüphaneye ihtiyacı yoktur; ekrana yazması yeterlidir. Kabuk Programlama kursunda
kurulan standart çıktı ve standart hata ayrımı burada işletim tarafında karşılığını bulur:
veri birinci akıştan, tanı iletisi ikinci akıştan gelir ve yönetici ikisini farklı düzeyle
damgalayabilir.

Üçüncüsü **uygulamanın kendisidir**. Bir program kendi seçtiği bir dosyaya kendi biçiminde
yazabilir. Bu dosya servis yöneticisinin görüş alanı dışındadır: birim durdurulsa da dosya
kalır, birim adıyla damgalanmaz, düzeyleri yöneticinin düzeyleriyle aynı olmak zorunda
değildir. Aynı olayın hem sistem günlüğünde hem de uygulamanın kendi dosyasında iki ayrı
biçimde durması olağan bir durumdur.

Üç kaynağın ortak yanı şudur: hiçbiri diğerinin ne yazdığını bilmez. Ayrımın pratik sonucu,
bir olayın izinin **tek bir adreste bulunacağının garantisi olmamasıdır**.

## Kalıcılık: Bellekte mi, Diskte mi

Sistem günlüğünün nereye yazıldığı bir yapılandırma kararıdır ve varsayılan davranış
dağıtıma göre değişebilir. Üç seçenek vardır. Günlük **yalnız bellekte** tutulabilir; bu
durumda yeniden başlatma bütün geçmişi siler ve makine kendini toparladıktan sonra arızanın
izi kalmaz. Günlük **diske** yazılabilir; geçmiş açılışlar sorgulanabilir hâle gelir, ama
dosya sınırsız büyümez ve bir boyut ya da süre sınırına ulaştığında en eskisini atar.
Üçüncü seçenek ikisinin karışımıdır: dizin varsa diske, yoksa belleğe.

Bu karar tanıyı doğrudan belirler. Bellekte tutulan bir günlükte, kendini yeniden başlatarak
kurtaran bir servisin arıza kaydı **kendi kurtulmasıyla birlikte silinir**. Servisler
konusunda ölçülen durum burada ikinci kez karşımıza çıkar: "her zaman" politikalı bir birim
altı yüz saniyede altmış kez yeniden başlıyor ve "çalışıyor" görünüyordu; o birimin makineyi
de yeniden başlatan bir arızası varsa, geriye ne durum kalır ne kayıt.

Diske yazılan günlükte ise sınır boyuttur. Sınıra ulaşan dosyanın eski kısmının atılmasına
**döndürme (rotation)** denir ve bu konunun üçüncü dersinin tamamı onun ne sildiğini sayar.
Şimdilik tek cümle yeter: kanıtın ömrü, kanıtı üreten olayın ömründen kısa olabilir.

Dördüncü bir ayrım da erişimdir. Günlük dosyaları da sıradan dosyalardır ve Linux'a Giriş
kursunda kurulan izin modeline uyarlar; kimlik olaylarını tutan dosyalar çoğunlukla
ayrıcalıksız kullanıcıya kapalıdır. Bir kaydın var olması, onu okuyabildiğiniz anlamına
gelmez.

## Zaman Damgası ve Sıra

Bir günlük satırının en çok güvenilen alanı zamandır, oysa en kırılgan alanı da odur. İki
ayrı saat vardır: makinenin açılışından beri geçen süreyi sayan **tek yönlü sayaç** ve
takvim saatini gösteren **duvar saati**. Birincisi geriye gitmez. İkincisi gider: saat
sunucusuyla eşitleme, elle düzeltme ve yaz saati geçişi duvar saatini ileri ya da geri
atlatabilir.

Sonucu şudur: duvar saatine göre sıralanmış bir günlükte, gerçekte önce olan bir olay sonra
olan bir olayın **altında** görünebilir. Nedensellik bir arıza incelemesinin ana aracıdır ve
tersine dönmüş iki satır, tanıyı doğrudan tersine çevirir. Bu yüzden yapılandırılmış
kayıtlar duvar saatinin yanında tek yönlü sayacı ve monoton artan bir **sıra numarası** da
tutar; sıralama yapılırken sayaca güvenmek duvar saatine güvenmekten daha sağlamdır.

Bu dersin ölçüsünde ve sonraki derslerde zaman, ortak tanımın **model saniyesidir**: gözlem
penceresi altı yüz saniyedir ve bütün süreler o pencerenin içinde sayılır. Gerçek bir zaman
damgası hiçbir yerde yazılmaz, çünkü gerçek zaman damgası makineye bağlıdır ve yeniden
üretilemez.

## Düzey, Alan ve Biçim

Her kaydın bir **düzeyi** vardır. Yaygın sıralama, hata ayıklama iletilerinden acil durum
iletilerine kadar uzanan sekiz basamaktır; bu konuda üç basamak yeter: `bilgi`, `uyari`,
`hata`. Düzey kaydı yazan tarafın kendi beyanıdır, bağımsız bir ölçüm değildir. Bir program
ölümcül bir durumu `bilgi` düzeyiyle yazarsa, düzeye göre süzen her araç o satırı atar.

Düzeyin ikinci sorunu eşiktir. Bir sistem günlüğü çoğunlukla bir alt sınırla çalışır:
belirlenen düzeyin altındaki satırlar yazılmaz. Hata ayıklama düzeyini kapalı tutmak günlüğü
küçültür, ama arıza anında en çok işe yarayacak ayrıntı da tam olarak orada durur. Eşiği
arızadan sonra açmak geçmişi geri getirmez; eşik, olay olurken neyin yazıldığını belirler.
Bu, kursun üçüncü iddiasının en yalın biçimidir: **geç bakan az görür.**

Yapılandırılmış kayıt ile düz metin arasındaki fark da burada belirir. Düz metin satırı tek
bir dizedir; okumak için ayrıştırmak gerekir. Yapılandırılmış kayıt alanlardan oluşur: birim
adı, düzey, süreç kimliği, zaman. Alanlar sorgulanabilir olduğu için süzme işi metin
eşlemeye değil alan karşılaştırmasına dayanır. Bu ayrım bir sonraki derste ölçülecek olan
şeyi belirler: metin eşleyen bir süzgeç ile alan bilen bir süzgeç aynı soruya farklı yanıt
verir.

## Aynı Olayın İki Adresi

Sistem günlüğü, bütün birimlerin kayıtlarını zaman sırasına göre tek bir akışta tutar.
Aşağıdaki döküm örnektir ve çalıştırılmamıştır; köşeli parantez içindeki sayı açılıştan
sonra geçen saniyedir.

```text
# ornek dokum , calistirilmis degildir
[  461.250] isleme[1043]: hata: kuyruk yaniti alinamadi
[  461.400] isleme[1043]: bilgi: yeniden deneme 1/5
[  463.100] olcum[1092]: uyari: ornekleme penceresi asildi
[  466.050] veri-alma[1014]: hata: akis kapandi
```

Aynı olaylar birim başına ayrılmış dosyalarda saklanırsa görüntü değişir. `isleme` biriminin
kendi dosyası şöyle görünür; bu döküm de örnektir ve çalıştırılmamıştır.

```text
# ornek dokum , calistirilmis degildir
[  461.250] hata: kuyruk yaniti alinamadi
[  461.400] bilgi: yeniden deneme 1/5
[  527.500] hata: kuyruk yaniti alinamadi
```

İkinci dökümde `olcum` ve `veri-alma` satırları yoktur. Kaybolan şey satır değil, **satırlar
arasındaki komşuluktur**: `isleme` biriminin hatasından beş saniye sonra `veri-alma`
biriminin akışının kapandığı bilgisi yalnız birleşik akışta durur.

İki dökümün ikinci farkı damgadır. Birleşik akışta her satırın önünde birim adı vardır;
birim dosyasında yoktur, çünkü dosyanın adı zaten birimi belirtir. Bu, dosya küçükken
tasarruf gibi görünür, ama iki dosya birleştirildiğinde satırların hangisinin nereden
geldiği kaybolur. Bir arıza incelemesinde farklı kaynaklardan gelen dökümleri tek zaman
ekseninde birleştirmek olağan bir adımdır; damgasız satırlar bu adımda kimliksiz kalır.

Üçüncü fark ise servis yöneticisinin damgayı **kendisinin** koymasıdır. Birim adı, süreç
kimliği ve düzey satırın içeriğinden değil, yöneticinin bildiği bağlamdan gelir. Program
kendi dosyasına yazdığında bu bağlam yoktur: aynı olayın uygulamanın kendi dosyasındaki
karşılığında birim adı bulunmaz, süreç kimliği programın yazmayı seçtiği kadardır ve düzey
programın kendi ölçeğine göre işaretlenir. Aynı olay, iki adreste iki farklı doğrulukta
temsil edilir.

## Ölçülen Şey: Tek Dosyaya Bakan Tanı

Ölçü, ortak tanımın günlük üretecinin üzerine kurulur. Kurgunun varsayımları şunlardır:
gözlem penceresi altı yüz saniye, günlük 4000 satır ve düzey ağırlıkları ortak tanımdan
gelir (**GN1**); kayıtlar altı birime dağılır (**GN2**); komşuluk penceresi beş saniyedir
(**GN3**); operatör açtığı tek dosyaya bakarak karar verir (**GN4**).

Kâhin, altı birimin gerçekte kaç hata yazdığıdır; kurguyu biz ürettiğimiz için biliniyor.
Araç çıktısı, operatörün açtığı **tek bir** birim dosyasıdır. Tanı, o dosyaya bakarak
verilen "hata kaynağı bu birimdir" kararıdır.

```python
TOHUM = 20260218
DONEM = 600                      # gozlem penceresi: 600 saniye


def uretec(tohum):
    d = tohum

    def sonraki(n):
        nonlocal d
        d = (d * 1103515245 + 12345) % 2147483648
        return d % n
    return sonraki


BIRIM = {
    "veri-alma":      {"gerektirir": [], "yeniden": "her zaman"},
    "kuyruk":         {"gerektirir": ["veri-alma"], "yeniden": "her zaman"},
    "isleme":         {"gerektirir": ["kuyruk"], "yeniden": "arizada"},
    "rapor":          {"gerektirir": ["isleme"], "yeniden": "hayir"},
    "olcum":          {"gerektirir": ["veri-alma"], "yeniden": "her zaman"},
    "yedek":          {"gerektirir": [], "yeniden": "hayir"},
}


def gunluk_uret(tohum=TOHUM, satir=4000):
    r = uretec(tohum)
    kayit = []
    for i in range(satir):
        agirlik = r(100)
        duzey = "hata" if agirlik < 3 else ("uyari" if agirlik < 12 else "bilgi")
        kayit.append({"sira": i, "saniye": i * (DONEM / satir),
                      "duzey": duzey, "birim": list(BIRIM)[r(len(BIRIM))]})
    return kayit


def birim_hatalari(kayitlar):
    d = {b: 0 for b in BIRIM}
    for k in kayitlar:
        if k["duzey"] == "hata":
            d[k["birim"]] += 1
    return d


def tek_gunluk_tanisi(kayitlar):
    """GN4: yalniz TEK bir birim dosyasina bakan operator: 'kaynak bu birim'."""
    d = birim_hatalari(kayitlar)
    suclu = max(d, key=lambda b: d[b])
    return {"gercek_kaynak": suclu, "sessiz_dosya": sum(1 for b in d if d[b] == 0),
            "denenen": len(d), "yanlis_tani": sum(1 for b in d if b != suclu)}


def komsu_hata(kayitlar, aralik=5.0):
    """GN3: bes saniye icinde BASKA bir birimden hata gelen hatalar."""
    h = [k for k in kayitlar if k["duzey"] == "hata"]
    return sum(1 for i, a in enumerate(h)
               if any(abs(b["saniye"] - a["saniye"]) <= aralik
                      and b["birim"] != a["birim"] for j, b in enumerate(h) if i != j))


for tohum in (TOHUM, 20260219):
    G = gunluk_uret(tohum)
    d = birim_hatalari(G)
    print("tohum", tohum, "| satir", len(G), "| hata", sum(d.values()),
          "| birim basina", list(d.values()))
    print("  ", tek_gunluk_tanisi(G), "| komsu hata", komsu_hata(G))
```

```
tohum 20260218 | satir 4000 | hata 86 | birim basina [28, 0, 31, 0, 27, 0]
   {'gercek_kaynak': 'isleme', 'sessiz_dosya': 3, 'denenen': 6, 'yanlis_tani': 5} | komsu hata 50
tohum 20260219 | satir 4000 | hata 163 | birim basina [0, 50, 0, 51, 0, 62]
   {'gercek_kaynak': 'yedek', 'sessiz_dosya': 3, 'denenen': 6, 'yanlis_tani': 5} | komsu hata 135
```

## Çıktının Söylediği ile Sistemin Gerçeği

Üç sayı yan yana durur. **Kâhin:** 4000 satırlık pencerede 86 hata var ve bunların 31'i
`isleme` birimine ait; gerçek kaynak odur. **Araç çıktısı:** altı birim dosyasının içeriği,
sırasıyla 28, 0, 31, 0, 27 ve 0 hata. **Yanlış tanı: 5.** Operatör altı dosyadan birini
açar ve "hata kaynağı bu birimdir" der; altı denemenin beşinde yanılır.

Bu beş yanılgının üçü aynı türden değildir. Üç dosya **tamamen sessizdir**: hiç hata satırı
tutmaz. O dosyayı açan operatör "burada sorun yok" sonucuna varır ve bu sonuç, kendi birimi
için doğru olsa bile **sistem hakkında yanlıştır** — sistemde 86 hata vardır. Kalan iki
dosya hata gösterir ama en çoğunu göstermez; oradaki operatör soruna bakar, yanlış birimi
suçlar. Sessizlik ile masumiyet aynı şey değildir.

İkinci sayı komşuluğu ölçer: 86 hatanın **50'sinin** beş saniye içinde başka bir birimden
gelen bir hata komşusu vardır. Bu 50 satırın hiçbiri, tek bir birim dosyasında komşusuyla
birlikte görünmez. Birim başına ayrılmış dosyalar satır kaybetmez; **sıra** kaybeder ve
sıranın kendisi bir kanıttır.

Buradan mimari bir karar çıkar: birim başına dosya, tek bir birimi derinlemesine incelerken
işe yarar; bir arızanın nereden başladığını bulmak içinse **birleşik ve zaman sıralı** akış
gerekir. İki adresten birini seçmek zorunlu değildir, ama hangisine bakıldığının tanıyı
belirlediği bilinmelidir.

Ölçünün sınırı da açıkça durmalıdır. Kâhin burada kurgunun kendisidir; gerçek bir makinede
hangi birimin gerçekten kaynak olduğunu bilen bir taraf yoktur, tanıyı sınayan tek şey
sonradan yapılan onarımın işe yarayıp yaramamasıdır. Kurgunun sağladığı şey, "altıda beş"
sayısının nereden geldiğinin görülebilmesidir: sayı, aracın kusurundan değil, **bakılan
adresin seçiminden** doğar. Aynı 4000 satır birleşik akışta okunsaydı hata dağılımı tek
sorguyla görünürdü ve yanlış tanı sıfıra inerdi. Araç yalan söylemiyor; eksik olan şey
sorunun sorulduğu yerdir.

Operasyonel sonuç iki maddedir. Birincisi, bir arıza incelemesine birim dosyasından değil
**birleşik akıştan** başlanır; birim dosyası, kaynağın hangi birim olduğu belirlendikten
sonra ayrıntı için açılır. İkincisi, sessiz bir dosya kanıt sayılmaz: o birimin hiç kayıt
yazmaması, birimin sağlıklı olduğunu değil, yalnız **yazmadığını** gösterir. Bir birimin
sustuğu bir arıza ile hiç sorun yaşamadığı bir pencere, günlük tarafından aynı biçimde
temsil edilir.

## İkinci Tohum

İkinci tohumla kurgu değişir: hata sayısı 163'e çıkar, hatalar farklı birimlere dağılır ve
gerçek kaynak `yedek` olur. Yanlış tanı sayısı **yine 5**, sessiz dosya sayısı **yine 3**
kalır; iki tohumda da yalnız üç birim hata yazar. Komşu hata oranı ise değişir: ilk tohumda
86 hatanın 50'si, ikincisinde 163 hatanın 135'i komşuludur. Oranın kendisi **kurguya
bağlıdır**; kurguya bağlı olmayan şey, tek dosyaya bakan tanının altıda beş yanılması ve
komşuluğun tek dosyada hiç görünmemesidir.

## Özet

- Günlük satırları üç ayrı kaynaktan doğar: çekirdeğin dairesel tamponu, servis
  yöneticisinin yakaladığı standart çıktı ve standart hata, uygulamanın kendi dosyası.
- Düzey, kaydı yazanın beyanıdır; bağımsız bir ölçüm değildir. Yanlış damgalanmış bir satırı
  düzeye göre süzen her araç atar.
- Kâhin 86 hatanın gerçek kaynağını bilir; tek bir birim dosyasına bakan tanı altı denemenin
  **beşinde** yanılır, üç dosya ise tamamen sessizdir.
- 86 hatanın **50'si** beş saniye içinde başka bir birimden gelen bir hataya komşudur; bu
  komşuluk yalnız birleşik ve zaman sıralı akışta görünür.
- Birim başına ayrılmış dosyalar satır kaybetmez, sıra kaybeder; sıra da bir kanıttır.

## Sonraki Adım

Bu derste bakılan kayıtların hepsi servislerin kendi ürettiği iletilerdi. Bir makinede
ayrıca kimin ne zaman girdiğini, hangi hesabın hangi yetkiyi istediğini ve hangi isteğin
reddedildiğini tutan ayrı bir olay kümesi vardır. O kayıtlar aynı sistem günlüğüne düşer ama
farklı okunur: sorulan soru "hangi birim bozuldu" değil, "kim yaptı" sorusudur. Sonraki ders
kimlik doğrulama günlüklerini ele alır ve metin eşleyen bir süzgecin bu soruya verdiği
yanıtın kaç satırda yanlış olduğunu sayar.
