Log İnceleme ve Filtreleme

Log dosyaları, sistemin işleyişi hakkında değerli bilgiler içerir, ancak genellikle çok büyük olabilirler. İhtiyaç duyulan bilgiyi bulmak için logları etkili bir şekilde incelemek ve filtrelemek önemlidir. Bu bölümde, hem geleneksel metin tabanlı log dosyaları hem de journald günlükleri için yaygın kullanılan araçlar ve teknikler ele alınacaktır.

Geleneksel Log Dosyaları (/var/log)

Bu dosyalar genellikle düz metin formatındadır ve standart komut satırı araçlarıyla işlenebilir.

1. Canlı Takip ve Basit Filtreleme (tail -f | grep)

Bir log dosyasını gerçek zamanlı olarak takip etmek ve belirli anahtar kelimeleri içeren satırları anında görmek için tail -f ve grep kombinasyonu sıkça kullanılır:

# /var/log/syslog dosyasını takip et ve içinde "error" geçen satırları göster (büyük/küçük harf duyarsız)
tail -f /var/log/syslog | grep -i "error"

# /var/log/nginx/access.log dosyasını takip et ve 404 hata kodlarını içeren satırları göster
tail -f /var/log/nginx/access.log | grep ' 404 ' 
  • tail -f: Dosyanın sonunu gösterir ve yeni eklenen satırları sürekli olarak ekrana basar.

  • grep: Standart girdiden gelen satırlar içinde belirtilen kalıbı arar.

2. Regex ile Gelişmiş Filtreleme (grep -E)

Daha karmaşık kalıpları eşleştirmek için grep -E (veya egrep) ile düzenli ifadeler (regular expressions) kullanılır:

# Apache access_log dosyasında belirli bir IP adresinden gelen istekleri bul
grep -E '^192\.168\.1\.10 ' /var/log/apache2/access.log

# auth.log dosyasında başarısız SSH login denemelerini bul
grep -E 'sshd\[[0-9]+\]: Failed password for' /var/log/auth.log

# access_log dosyasından sadece GET isteklerini içeren satırları çıkar
grep -E '^(\S+) (\S+) (\S+) \[.*\] "GET ' /var/log/nginx/access.log

3. Alanlara Göre İşleme (awk)

Log satırları genellikle boşluk veya başka bir ayırıcı ile ayrılmış alanlardan oluşur. awk, bu alanlara göre işlem yapmak için çok güçlü bir araçtır:

# access_log dosyasındaki her satırın ilk alanını (IP adresi) yazdır
tail -n 50 /var/log/nginx/access.log | awk '{print $1}'

# Belirli bir IP adresinden gelen isteklerin sayısını bul
awk '$1 == "192.168.1.10" { count++ } END { print count }' /var/log/nginx/access.log

# 404 hatası veren isteklerin URL'lerini (7. alan) yazdır
awk '$9 == "404" { print $7 }' /var/log/nginx/access.log | head

4. Metin Değiştirme (sed)

Loglar üzerinde basit metin değiştirme veya ayıklama işlemleri için sed kullanılabilir:

# syslog dosyasındaki tüm "WARN" kelimelerini "UYARI" ile değiştir (sadece ekrana basar)
sed 's/WARN/UYARI/g' /var/log/syslog | less

# access_log dosyasından tarih/saat bilgisini çıkar
sed -E 's/^([^ ]+) ([^ ]+) ([^ ]+) \[.*\] (.*)/\1 \4/' /var/log/nginx/access.log | head

systemd-journald Günlükleri (journalctl)

journald, logları yapılandırılmış bir formatta sakladığı için journalctl komutu güçlü filtreleme yetenekleri sunar.

Canlı Takip:

# Tüm günlükleri canlı takip et
sudo journalctl -f

# Belirli bir servisin günlüklerini canlı takip et
sudo journalctl -f -u nginx.service

Filtreleme:

  • Servise Göre (-u):

    sudo journalctl -u sshd.service
  • Önem Derecesine Göre (-p):

    # Sadece hata ve daha kritik mesajları göster
    sudo journalctl -p err 
    
    # Uyarı ve daha kritik mesajları göster
    sudo journalctl -p warning..alert 
  • Zamana Göre (--since, --until):

    sudo journalctl --since "1 hour ago"
    sudo journalctl --since "09:00" --until "10:30"
  • Çekirdek Mesajları (-k):

    sudo journalctl -k
  • Belirli Önyükleme (-b):

    sudo journalctl -b    # Mevcut önyükleme
    sudo journalctl -b -1 # Bir önceki önyükleme
    sudo journalctl --list-boots # Tüm önyüklemeleri listele
  • Meta Veri Alanlarına Göre: journald logları birçok meta veri alanı ile saklar (_PID, _UID, _EXE, _SYSTEMD_UNIT, SYSLOG_FACILITY vb.). Bu alanlara göre filtreleme yapılabilir:

    # Belirli bir PID'ye ait loglar
    sudo journalctl _PID=12345
    
    # Belirli bir çalıştırılabilir dosyaya ait loglar
    sudo journalctl /usr/sbin/sshd
    
    # Belirli bir syslog facility koduna ait loglar
    sudo journalctl SYSLOG_FACILITY=10 # authpriv için
  • Metin Arama (grep ile): journalctl çıktısı metin tabanlı olduğu için grep ile de filtrelenebilir:

    sudo journalctl -u nginx.service | grep "denied"

Logları etkili bir şekilde incelemek, sistem yönetimi ve sorun gidermenin önemli bir parçasıdır. Hem geleneksel araçları hem de journalctl'i bilmek, farklı durumlarla başa çıkmanıza yardımcı olur.

Last updated