
Linux'ta Log Yönetimi: Sistem Loglarını Okuma ve Analiz Etme
Linux sistem loglarını nasıl okur ve analiz edersiniz? /var/log dizini, journalctl, logrotate ve log analizi için pratik komutlar ile sunucu sorun giderme rehberi.
Linux'ta Log Yönetimi: Sistem Loglarını Okuma ve Analiz Etme
Linux'ta her sistem aktivitesi log dosyalarına kaydedilir. Web sunucusu hataları, kimlik doğrulama girişimleri, sistem servisleri ve güvenlik olaylarının tamamı log dosyalarında tutulur. Bu dosyaları okumak ve analiz etmek, sorunları hızla teşhis etmenin anahtarıdır.
Linux Log Dosya Yapısı
Logların büyük çoğunluğu /var/log/ dizininde saklanır:
/var/log/
├── syslog / messages → Genel sistem logları
├── auth.log / secure → Kimlik doğrulama logları
├── kern.log → Çekirdek logları
├── dmesg → Donanım başlangıç mesajları
├── apache2/ / httpd/ → Apache web sunucu logları
├── nginx/ → Nginx logları
├── mysql/ → MySQL/MariaDB logları
├── php-fpm.log → PHP-FPM logları
├── mail.log → Mail sunucu logları
└── cron → Cron job logları
Temel Log Okuma Komutları
# Son 50 satır
tail -50 /var/log/syslog
# Canlı log takibi
tail -f /var/log/nginx/error.log
# Birden fazla log takibi
tail -f /var/log/nginx/error.log /var/log/php-fpm.log
# İlk 100 satır
head -100 /var/log/syslog
# Tüm dosyayı sayfa sayfa oku
less /var/log/syslog
Apache Web Sunucu Logları
Apache iki temel log dosyası tutar:
Access Log
Tüm HTTP istekleri kaydedilir:
192.168.1.100 - - [15/Jan/2026:10:30:00 +0300] "GET /index.php HTTP/1.1" 200 4521
Format: IP - - [Tarih] "İstek" DurumKodu Boyut
# Bugünkü 404 hataları
grep "404" /var/log/apache2/access.log | grep "$(date +'%d/%b/%Y')"
# En fazla istek atan IP'ler
awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -10
# 500 hataları
grep " 500 " /var/log/apache2/access.log | tail -20
Error Log
Uygulama ve sunucu hataları:
tail -50 /var/log/apache2/error.log
grep "PHP" /var/log/apache2/error.log | tail -20
Nginx Logları
# Hata logları
tail -100 /var/log/nginx/error.log
# Erişim logları
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
# Belirli HTTP kodları
grep '"5[0-9][0-9]' /var/log/nginx/access.log | tail -20
MySQL Logları
# MySQL hata logu
tail -50 /var/log/mysql/error.log
# Yavaş sorgu logu (aktifse)
tail -50 /var/log/mysql/mysql-slow.log
Sistem Logları
/var/log/auth.log (Ubuntu) / /var/log/secure (RHEL)
Kimlik doğrulama olayları:
# Başarısız SSH giriş denemeleri
grep "Failed password" /var/log/auth.log | tail -20
# Başarılı giriş
grep "Accepted password" /var/log/auth.log | tail -10
# Brute force tespiti
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn | head -10
/var/log/syslog
Genel sistem olayları:
# Son sistem mesajları
tail -100 /var/log/syslog
# OOM (Out of Memory) sorunları
grep -i "oom|kill" /var/log/syslog | tail -20
# Disk hataları
grep -i "error|failed" /var/log/syslog | grep -i "disk|io" | tail -10
journalctl ile Log Yönetimi (systemd)
Modern Linux sistemlerde journald, logları merkezi olarak yönetir:
# Tüm sistem logları
journalctl
# Son loglar
journalctl -n 50
# Canlı takip
journalctl -f
# Belirli servis
journalctl -u nginx
journalctl -u mysql --since today
# Tarih aralığı
journalctl --since "2026-01-01" --until "2026-01-31"
journalctl --since "1 hour ago"
# Hata ve üzeri
journalctl -p err
journalctl -p warning
# Önyükleme logları
journalctl -b 0 # Bu önyükleme
journalctl -b -1 # Önceki önyükleme
# Boyut bilgisi
journalctl --disk-usage
logrotate ile Log Rotasyonu
Log dosyaları büyümemesi için logrotate ile periyodik dönüştürme yapılır:
# Manuel logrotate çalıştır
logrotate -f /etc/logrotate.conf
# Konfigürasyon kontrolü
logrotate -d /etc/logrotate.conf
Örnek logrotate konfigürasyonu (/etc/logrotate.d/nginx):
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
nginx -s reload
endscript
}
Pratik Log Analizi Örnekleri
# Son 1 saattteki 500 hatalarını say
grep "$(date -d '1 hour ago' +'%d/%b/%Y:%H')" access.log | grep " 500 " | wc -l
# Saatlik istek dağılımı
awk '{print $4}' access.log | cut -d: -f2 | sort | uniq -c
# Yavaş istekler (belirli sayfa)
grep "/api/products" access.log | awk '{if ($NF > 2000) print $0}'
# Bant genişliği tüketen URL'ler
awk '{sum[$7]+=$10} END {for (url in sum) print sum[url], url}' access.log | sort -rn | head -10
Büyükweb VDS Log Yönetimi
Büyükweb VDS sunucular ile loglarınızı gerçek zamanlı olarak izleyebilirsiniz. Fail2Ban gibi araçlarla log tabanlı otomatik güvenlik eylemleri de yapılandırılabilir.
Sonuç
Linux log yönetimi, sorun tespiti ve güvenlik izleme için vazgeçilmezdir. tail -f ile canlı log takibi, grep ve awk ile filtreleme ve journalctl ile merkezi log yönetimi, günlük sunucu yönetiminin temel araçlarıdır. Düzenli log analizi, sorunları büyümeden önce tespit etmenizi sağlar.
journald Detaylı Kullanım
systemd-journald modern Linux'un default log motorudur. Ama default ayarlarla logları reboot'ta kaybedersin — persistent storage etkin değil.
# Persistent storage aktive et
mkdir -p /var/log/journal
systemd-tmpfiles --create --prefix /var/log/journal
systemctl restart systemd-journald
# /etc/systemd/journald.conf
[Journal]
Storage=persistent
SystemMaxUse=2G # toplam max disk
SystemMaxFileSize=100M # her dosya max
SystemMaxFiles=20 # rotation count
ForwardToSyslog=yes # rsyslog'a da gönder
RateLimitInterval=30s
RateLimitBurst=10000
Compress=yes
Seal=yes # şifreli imza (forensik koruma)
Cursor ve Resume
# Belirli bir noktayı kaydet
journalctl -n 1 --show-cursor > /tmp/cursor.txt
# O noktadan sonrası
journalctl --after-cursor="$(cat /tmp/cursor.txt | grep -oP 's=.*')"
# JSON çıktı (script için)
journalctl -u nginx -o json-pretty | jq '.MESSAGE'
journalctl -u nginx -o json | jq -r '. | "\(.PRIORITY) \(.MESSAGE)"'
# Kernel + servis filtre kombinasyonu
journalctl -k -u nginx --since "10 min ago"
# Disk doluyor mu?
journalctl --vacuum-size=500M # 500 MB'a düşür
journalctl --vacuum-time=7d # 7 günden eski sil
journald Forwarding (Merkezi)
# /etc/systemd/journal-upload.conf — uzaktaki journal-remote'a gönder
[Upload]
URL=https://logs.example.com:19532
ServerKeyFile=/etc/ssl/private/journal-upload.pem
ServerCertificateFile=/etc/ssl/certs/journal-upload.crt
systemctl enable --now systemd-journal-upload
rsyslog — Klasik ama Hâlâ Güçlü
journald yanında rsyslog çoğu Linux dağıtımında paralel çalışır; hub-and-spoke log toplama için endüstri standardı:
# /etc/rsyslog.d/30-forward.conf — UDP/TCP/TLS yönlendirme
*.* @@logserver.example.com:514 # TCP
*.* @logserver.example.com:514 # UDP (hızlı, kayıp tolere)
*.* @@(o)logserver.example.com:6514 # TLS şifreli
# Belirli pattern'i ayrı dosyaya
:msg,contains,"sshd" /var/log/sshd-only.log
& stop # diğer kurallara gitmesin
# Filtrele + gönder
if $syslogtag == "nginx" and $msg contains "error" then {
action(type="omfwd" target="logserver" port="514" protocol="tcp")
}
# Yapılandırma test
rsyslogd -N1
systemctl restart rsyslog
syslog-ng alternatif olarak Balabit'in (modern fork) ürünü; daha esnek pattern matching ve daha hızlı disk-buffer.
Structured Logging (JSON Log)
Modern uygulamalar artık JSON formatında log üretir. Filtreleme ve agregasyon dramatik kolaylaşır:
# /etc/nginx/nginx.conf — JSON access log
log_format json_combined escape=json '{'
'"time":"$time_iso8601",'
'"remote_addr":"$remote_addr",'
'"request":"$request",'
'"status":$status,'
'"body_bytes_sent":$body_bytes_sent,'
'"http_referer":"$http_referer",'
'"http_user_agent":"$http_user_agent",'
'"request_time":$request_time,'
'"upstream_response_time":"$upstream_response_time"'
'}';
access_log /var/log/nginx/access.json.log json_combined;
# jq ile filtreleme
tail -f /var/log/nginx/access.json.log | jq -c 'select(.status >= 500)'
# Yavaş istekler (request_time > 2 sn)
jq 'select(.request_time > 2) | "\(.request) \(.request_time)s"' access.json.log
# Status code dağılımı
jq -r '.status' access.json.log | sort | uniq -c | sort -rn
ELK / EFK Stack — Centralized Logging
Birden fazla sunucudan log toplamak için endüstri standardı:
| Bileşen | Görev | Alternatif |
|---|---|---|
| Elasticsearch | Index + arama | OpenSearch (topluluk fork), Loki (Grafana) |
| Logstash | Parse + transform | Fluentd, Vector, Filebeat |
| Kibana | Dashboard + arama UI | Grafana, OpenSearch Dashboards |
| Beats/Filebeat | Agent — log toplama | Fluent Bit, Vector |
# filebeat.yml — minimal
filebeat.inputs:
- type: filestream
id: nginx-access
paths:
- /var/log/nginx/access.json.log
parsers:
- ndjson:
target: ""
add_error_key: true
output.elasticsearch:
hosts: ["es.example.com:9200"]
index: "nginx-access-%{+yyyy.MM.dd}"
username: "filebeat"
password: "${FILEBEAT_PASS}"
Loki + Grafana alternatifi (Prometheus felsefesi — sadece label index, içerik full-text yok): %70 daha düşük disk, ucuz uzun-vadeli saklama. Production'da yaygınlaşıyor.
Vector — Modern Log Pipeline
Datadog'un open-source pipeline'ı; Rust ile yazılmış, Logstash'in 2-3 katı performans:
# /etc/vector/vector.toml
[sources.nginx]
type = "file"
include = ["/var/log/nginx/access.json.log"]
[transforms.parse]
type = "remap"
inputs = ["nginx"]
source = '. = parse_json!(.message)'
[transforms.filter_5xx]
type = "filter"
inputs = ["parse"]
condition = '.status >= 500'
[sinks.loki]
type = "loki"
inputs = ["filter_5xx"]
endpoint = "http://loki:3100"
labels.host = "{{ host }}"
labels.app = "nginx"
auditd — Sistem Çağrı İzleme
Hangi dosya kim tarafından, ne zaman, hangi process'ten okundu/yazıldı? Forensik için altın standart:
apt install auditd
# /etc/audit/rules.d/audit.rules
-w /etc/passwd -p wa -k passwd_changes
-w /etc/shadow -p wa -k shadow_changes
-w /etc/sudoers -p wa -k sudoers_changes
-w /var/log/auth.log -p wa -k auth_log_tampering
-a always,exit -F arch=b64 -S execve -k exec_log
-a always,exit -F arch=b64 -S unlink -S rmdir -k file_delete
augenrules --load
systemctl restart auditd
# Sorgulama
ausearch -k passwd_changes
ausearch -k exec_log -ts today
aureport --summary
KVKK / ISO 27001 uyum için kritik — kullanıcı verisi içeren dosyalara erişim izini.
Log Analiz Araçları
GoAccess — Real-time Dashboard
apt install goaccess
# Terminal-based dashboard
goaccess /var/log/nginx/access.log -c
# HTML rapor
goaccess /var/log/nginx/access.log -o /var/www/html/report.html \
--log-format=COMBINED
# Real-time (canlı tail + websocket)
goaccess /var/log/nginx/access.log -o report.html \
--real-time-html --log-format=COMBINED &
Dashboard içerikleri: Top URL, top IP, status code dağılımı, bot trafik, geo-location, OS/browser dağılımı.
lnav — Log Navigator
Birden fazla log dosyasını timestamp'e göre interleave ederek tek pencerede gösterir:
apt install lnav
lnav /var/log/nginx/error.log /var/log/php-fpm.log /var/log/mysql/error.log
# SQL sorgusu (lnav SQLite tabanlı)
;SELECT log_level, count(*) FROM logline GROUP BY log_level
multitail — Çoklu tail -f
multitail -i /var/log/syslog -i /var/log/nginx/error.log
# Renkli + filtre
multitail -e "ERROR" /var/log/syslog -e "5[0-9][0-9]" /var/log/nginx/access.log
Güvenlik Olayları İçin Pratik Sorgular
# Son 24 saatte SSH brute-force IP'leri
grep "Failed password" /var/log/auth.log | \
awk '{print $11}' | sort | uniq -c | sort -rn | head -20
# Sudo komutları (kim ne çalıştırdı)
grep "COMMAND" /var/log/auth.log | \
awk -F'COMMAND=' '{print $1, $2}'
# Cron job çıktıları
grep CRON /var/log/syslog | grep -v "session"
# Yeni kullanıcı oluşturma denemeleri
grep -E "useradd|usermod|userdel|passwd" /var/log/auth.log
# Web shell tespit (tipik aktivite)
grep -E "wget|curl.*\.php|nc -l|/tmp/.*\.sh" /var/log/nginx/access.log
# OOM killer
grep -i "killed process" /var/log/syslog
logrotate Gelişmiş Yapılandırma
# /etc/logrotate.d/custom-app
/var/log/myapp/*.log {
daily
rotate 30
compress
delaycompress
notifempty
missingok
create 0640 myapp adm
sharedscripts
postrotate
# Servis sinyali (graceful reopen)
kill -USR1 $(cat /var/run/myapp.pid) 2>/dev/null || true
endscript
# Custom prerotate (örn. Filebeat'a "rotation oluyor" sinyali)
prerotate
/usr/local/bin/notify-rotation.sh /var/log/myapp/
endprerotate
}
# Boyut tabanlı (zaman değil)
/var/log/access.log {
size 100M
rotate 10
compress
copytruncate # tail -f ile uyumlu
}
copytruncate — log dosyasını rename etmek yerine kopyala + truncate yapar; tail/Filebeat aynı file descriptor'i tutar, kayıp olmaz.
KVKK ve GDPR — Log Saklama
Kişisel veri (IP adresi, kullanıcı adı, e-posta) içeren log'lar KVKK kapsamında:
| Log türü | Önerilen süre | Anonimleştirme |
|---|---|---|
| Web access (IP) | 6-12 ay | Son oktet maskeleme (192.168.1.*) |
| Auth log | 1 yıl (ISO 27001) | username hash |
| Application log | 90 gün | PII alanları redact |
| Audit log (denetim) | 5 yıl (sektöre göre) | imzalı, change-tamper detect |
# Nginx — IP son oktet maskeleme
log_format anonymized escape=json '{'
'"time":"$time_iso8601",'
'"remote_addr_masked":"$remote_addr_masked",'
...
'}';
map $remote_addr $remote_addr_masked {
~(?<a>\d+\.\d+\.\d+)\.\d+ "$a.0";
default "0.0.0.0";
}
Production Checklist
- /var/log için ayrı disk/partition (root'u doldurmasın)
- logrotate her servis için yapılandırılmış (
logrotate -dile dry-run kontrol) - journald persistent storage aktif + size limit
- Centralized logging (Loki/ELK/Vector) — en az 2 sunucu varsa
- Critical alarm — disk %85 dolduğunda Slack/PagerDuty
- Audit log immutable (chattr +a, log forwarding)
- PII anonimleştirme nginx/auth seviyesinde
- Backup — log arşivleri ayrı server'da (S3/B2)
- Retention policy dokümante edildi (KVKK uyum)
- Periyodik log review (haftalık dashboard inceleme)
Sıkça Sorulan Sorular
journalctl mi tail -f mi?
journalctl systemd servislerini filtreleyebilir (-u nginx); structured field (_PID, _UID, _HOSTNAME) ile sorgulanabilir. Ancak custom log dosyaları (örn. uygulamanın /var/log/myapp.log) journald'de değil — orada tail -f. Modern öneri: uygulamayı systemd unit olarak çalıştır, stdout/stderr journald'ye gitsin → journalctl -u myapp -f.
Disk %95 dolu, /var/log temizleyim mi?
Hızlı kazanım: journalctl --vacuum-time=2d, find /var/log -name "*.gz" -mtime +30 -delete. Ama mutlaka kök neden bul: hangi servis log spam'liyor? du -sh /var/log/* | sort -rh | head ile en büyük dosyaları gör; logrotate eksikse onu yapılandır.
"tail -f" performansı yüksekte mi?
Tek sunucuda problem yok. Ancak yüksek-yazımlı log'da (1000+ satır/sn) tail -F (büyük F, file descriptor takip) kullan, çoklu tail -f yerine multitail veya lnav. Yüksek volüm = mutlaka centralized logging (filebeat → ES).
journald boyutu bilinçli sınırlamak iyi mi yoksa kötü mü?
Sınırlama iyi — disk dolarsa system unstable olur. Default: SystemMaxUse=10% (disk %10'u). 50 GB disk'te 5 GB journal ideal. Critical event'leri uzun saklamak istiyorsan forwarding (Loki/ELK) yap, journald'yi local hızlı cache olarak tut.
Apache vs Nginx access log format'ı tek araç ile parse edilir mi?
GoAccess, lnav, GoReplay her ikisini de destekler (combined format ortak). Custom format için log_format parametresi araçlara verilir. JSON format tercih edersen tek format herkese uyar — modern stack için en iyisi.
Distributed (10+ sunucu) için ne tercih?
- Filebeat → Elasticsearch + Kibana — full-text arama gerekiyorsa, kaynak yetiyorsa
- Promtail → Loki + Grafana — sadece label-based index, hız + ucuzluk
- Vector → ClickHouse — yüksek hacim, OLAP analitik
- Fluent Bit → New Relic / Datadog — managed, hızlı kurulum, aylık $ önemli değilse
"Logs are eating my disk" — hızlı tanı?
du -sh /var/log/* 2>/dev/null | sort -rh | head -10
journalctl --disk-usage
journald'yi vacuum et, eksik logrotate'i ekle, en büyük logu üreten servisin log seviyesini düşür (debug → warn).
Application log (Node.js, Python, Go) nasıl yapı?
Application'ın stdout/stderr'ine JSON yaz; systemd unit ile çalıştır. Pino (Node), structlog (Python), zerolog (Go) gibi structured logger kullan. journalctl -u app -o json | jq ile sorgu hazır.
Log injection saldırısı nedir?
Kullanıcı input'u log'a doğrudan yazılıyorsa (örn. logger.info(f"Login: {username}")) saldırgan \n + sahte log satırı enjekte eder, forensik analizi yanıltır. Önlem: input sanitize, structured logging (kullanıcı verisi ayrı field'da), control character escape.
Büyükweb VDS'te Log Yönetimi
Büyükweb VDS ve fiziksel dedicated sunucular tam kontrol verir — /etc/rsyslog.d/, /etc/systemd/journald.conf, /etc/logrotate.d/ istediğiniz gibi yapılandırabilirsiniz. Centralized logging (ELK, Loki, Vector) self-hosted kurulumlar için 4 GB+ RAM önerilir; küçük setup'lar için E5v2 VDS yeterli, büyük cluster için E5v4 VDS tercih edilir.
cPanel hosting paketlerinde son kullanıcı erişimi sınırlı; AWStats / Webalizer ile basic log özetleri ve Raw Access Log indirme imkânı var.
İlgili Rehberler
- Linux Sunucu Temel Komut Satırı SSH
- fail2ban Kurulumu ve Yapılandırması
- Debian 12 Sunucu Kurulumu Güvenlik
- Restic + Backblaze B2 Encrypted Backup
- Nginx SSL/TLS HTTPS Yapılandırması
İlgili Büyükweb Hizmetleri
Linux tercih eden yöneticiler için Türkiye lokasyonlu sunucu paketlerimiz:
Sorularınız için 0850 302 60 70 numaralı destek hattımıza veya iletişim sayfamıza yazabilirsiniz.
Linux & Komut Satırı İlgili Hizmetlerimiz
Bu yazıda anlatılan teknik konuyu profesyonel altyapıyla deneyimleyin
Etiketler:

