summaryrefslogtreecommitdiff
path: root/docs/manual/logs.xml.tr
blob: a9d88d78aa6a37c489d0d5c98829fd3145b59275 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
<?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: 1741841 -->
<!-- =====================================================
 Translated by: Nilgün Belma Bugüner <nilgun belgeler.gen.tr>
   Reviewed by: Orhan Berent <berent belgeler.gen.tr>
========================================================== -->

<!--
 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>

    <highlight language="config">
LogLevel info rewrite:trace5
    </highlight>

    <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>'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>

      <highlight language="config">
LogFormat "%h %l %u %t \"%r\" %&gt;s %b" common
CustomLog logs/access_log common
      </highlight>

      <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>%&gt;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>

      <highlight language="config">
LogFormat "%h %l %u %t \"%r\" %&gt;s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
CustomLog log/access_log combined
      </highlight>

      <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>

      <highlight language="config">
LogFormat "%h %l %u %t \"%r\" %&gt;s %b" common
CustomLog logs/access_log common
CustomLog logs/referer_log "%{Referer}i -&gt; %U"
CustomLog logs/agent_log "%{User-agent}i"
      </highlight>

      <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>

      <highlight language="config">
# yerel konaktan kaynaklanan istekleri imleyelim
SetEnvIf Remote_Addr "127\.0\.0\.1" kaydetme
# robots.txt dosyası isteklerini imleyelim
SetEnvIf Request_URI "^/robots\.txt$" kaydetme
# Kalanları günlüğe kaydedelim
CustomLog logs/access_log common env=!kaydetme
      </highlight>

      <p>Başka bir örnek olarak, Türkçe belge isteklerini bir dosyaya diğer
        dillerdeki istekleri başka bir dosyaya kaydedelim.</p>

      <highlight language="config">
SetEnvIf Accept-Language "tr" turkce
CustomLog logs/turkce_log common env=turkce
CustomLog logs/diger_diller_log common env=!turkce
      </highlight>

      <p>Bir arabellekleme senaryosuna arabelleğin verimli kullanılıp
        kullanılmadığını bilmek isteyelim. Bu basitçe şöyle yapılabilir:</p>

      <highlight language="config">
SetEnv CACHE_MISS 1
LogFormat "%h %l %u %t "%r " %>s %b %{CACHE_MISS}e" common-cache
CustomLog logs/access_log common-cache
      </highlight>

      <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>

      <highlight language="config">
LogFormat "%400,501{User-agent}i" browserlog
LogFormat "%!200,304,302{Referer}i" refererlog
      </highlight>

      <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şula 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>

    <highlight language="config">
CustomLog "|/usr/local/apache/bin/rotatelogs /var/log/access_log 86400" common
    </highlight>

    <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>

    <highlight language="config">
# Kabuk kullanarak "rotatelogs" çalıştırmak
CustomLog "|$/usr/local/apache/bin/rotatelogs /var/log/access_log 86400" common
    </highlight>

    <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>

    <note><title>Windows'ta yığın alanı</title>
    <p>Windows'ta çok sayıda borulu günlükleme süreci çalışırken ve özellikle
      HTTPD bir hizmet olarak çalışıyorsa sorunlar baş gösterebilir. Bunun
      başlıca sebebi masaüstü yığın alanının (heap) dışına taşılmasıdır. Her
      hizmete ayrılan masüstü yığın alanı, kayıt defterindeki
      HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SessionManager\SubSystems\Windows
      kaydındaki üçüncü değiştirge olan <code>SharedSection</code>
      değeridir. <strong>Bu değeri değiştirirken çok dikkatli olun</strong>;
      bu, Windows kayıt defterini değiştirirken verilen normal
      uyarılardandır, fakat eğer bu değer çok yüksek olursa masaüstü yığın
      alanının tükenebileceği dikkate alınmalıdır.</p>
    </note>
  </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>

    <highlight language="config">
LogFormat "%v %l %u %t \"%r\" %&gt;s %b" ortaksankon
CustomLog logs/access_log ortaksankon
    </highlight>

    <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/split-logfile.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>