Linux'ta Sistem Açılışında iSCSI Kurulumu
iSCSI (Internet Small Computer Systems Interface), ağ üzerinden depolama cihaz...
 
        Log dosyalarını analiz etmek sistem yöneticisi ve geliştiricilerin en sık karşılaştığı görevlerden biridir. tail -f, grep, less gibi araçları birliştirip sürekli terminal değiştirmek yorucu değil mi? lnav (Log File Navigator) tam bu sorunu çözmek için tasarlanmış devrimsel bir araçtır.
lnav, log dosyalarını analiz etmek için özel olarak tasarlanmış gelişmiş bir terminal uygulamasıdır. Apache, Nginx, systemd journal, Docker, PostgreSQL ve yüzlerce farklı log formatını otomatik olarak algılayarak tek bir arayüzde birleştirir.
# APT ile kurulum
sudo apt-get update
sudo apt-get install lnav
# Snap ile kurulum
sudo snap install lnav
# DNF ile kurulum (Fedora)
sudo dnf install lnav
# YUM ile kurulum (CentOS/RHEL)
sudo yum install lnav
# EPEL repository gerekli olabilir
sudo yum install epel-release# Homebrew ile kurulum (önerilen)
brew install lnav
# MacPorts ile kurulum
sudo port install lnav# Scoop ile kurulum
scoop install lnav
# Chocolatey ile kurulum
choco install lnav
# WSL içinde Linux kurulum komutları kullanılabilir
# Gerekli bağımlılıklar
sudo apt-get install build-essential libncurses5-dev libreadline-dev zlib1g-dev libbz2-dev libsqlite3-dev libcurl4-openssl-dev
# Kaynak kodunu indirme ve derleme
wget https://github.com/tstack/lnav/releases/download/v0.11.2/lnav-0.11.2.tar.gz
tar xzf lnav-0.11.2.tar.gz
cd lnav-0.11.2
./configure
make
sudo make install# Tek dosya açma
lnav /var/log/syslog
# Birden fazla dosya açma
lnav /var/log/nginx/access.log /var/log/nginx/error.log
# Dizindeki tüm logları açma
lnav /var/log/
# Compressed logları da dahil etme
lnav /var/log/*.log /var/log/*.gz# Watch mode ile başlatma
lnav -t /var/log/syslog
# Tail mode (yeni satırları takip et)
lnav -f /var/log/apache2/access.log
# Recursive mode (alt dizinleri de tara)
lnav -r /var/log/| Kısayol | Açıklama | 
|---|---|
| Space/b | Sayfa aşağı/yukarı | 
| ↑/↓ | Satır aşağı/yukarı | 
| Home/End | Dosya başı/sonu | 
| g/G | Belirli satıra git / Son satıra git | 
| n/N | Sonraki/önceki arama sonucu | 
| / | Arama modunu aç | 
| Kısayol | Açıklama | 
|---|---|
| t | Zaman damgası görünümünü aç/kapat | 
| T | Belirli zamana git | 
| d/D | Bir gün ileri/geri | 
| h/H | Bir saat ileri/geri | 
| m/M | Bir dakika ileri/geri | 
| Kısayol | Açıklama | 
|---|---|
| f | Filtre menüsünü aç | 
| F | Tüm filtreleri temizle | 
| s | Histogram görünümünü aç/kapat | 
| x | Log level görünümü | 
| X | Genişletilmiş görünüm | 
lnav'ın en güçlü özelliklerinden biri, log verilerini SQL ile sorgulayabilmesidir.
-- Komut satırını açmak için `:` tuşuna basın
-- Tüm ERROR seviyesindeki logları göster
:filter-in log_level = 'error'
-- Son 1 saatteki logları listele
SELECT * FROM all_logs WHERE log_time >= datetime('now', '-1 hour')
-- IP adresine göre gruplama (Apache/Nginx logları için)
SELECT c_ip, count(*) as hit_count 
FROM access_log 
GROUP BY c_ip 
ORDER BY hit_count DESC 
LIMIT 10
-- HTTP status kodlarını analiz et
SELECT sc_status, count(*) as count 
FROM access_log 
WHERE log_time >= datetime('now', '-1 day') 
GROUP BY sc_status 
ORDER BY count DESC
-- Error loglarındaki en sık tekrar eden mesajları bul
SELECT log_body, count(*) as frequency 
FROM all_logs 
WHERE log_level = 'error' 
GROUP BY log_body 
ORDER BY frequency DESC 
LIMIT 5
-- Zaman bazlı analiz (saatlik breakdown)
SELECT strftime('%H', log_time) as hour, count(*) as request_count 
FROM access_log 
WHERE log_time >= date('now') 
GROUP BY hour 
ORDER BY hour
-- Response time analizi
SELECT avg(duration), min(duration), max(duration) 
FROM access_log 
WHERE sc_status = 200
-- Hata oranı hesaplama
SELECT (SELECT count(*) FROM access_log WHERE sc_status >= 400) * 100.0 / 
       (SELECT count(*) FROM access_log) as error_percentage
-- Unique ziyaretçi sayısı
SELECT count(DISTINCT c_ip) as unique_visitors 
FROM access_log 
WHERE log_time >= date('now')lnav otomatik olarak şu formatları algılar:
~/.lnav/formats/ dizininde custom format dosyaları:
cat > ~/.lnav/formats/myapp.json << EOF
{
  "myapp_log": {
    "title": "My Application Log Format",
    "description": "Custom log format for my application",
    "url": "http://example.com/log-format",
    "regex": {
      "std": {
        "pattern": "^(?P\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}) \\[(?P\\w+)\\] (?P.*)"
      }
    },
    "timestamp-field": "timestamp",
    "level-field": "level",
    "body-field": "body"
  }
}
EOF# Önemli logları işaretle
:bookmark "Critical error occurred"
# Annotation ekle
:comment "This error started the cascade failure"
# Bookmark listesini görüntüle
:bookmarks
# Session kaydet
:save-session /tmp/debug-session.lnav
# Session yükle
lnav -s /tmp/debug-session.lnav
# Son session'ı otomatik yükle
lnav -r
# Nginx access ve error loglarını birlikte analiz
lnav /var/log/nginx/access.log /var/log/nginx/error.log
# SQL ile analiz
:;SELECT c_ip, count(*) FROM access_log GROUP BY c_ip ORDER BY count(*) DESC LIMIT 10
:filter-in sc_status >= 400
# Systemd journal ve syslog birlikte
lnav /var/log/syslog
# veya
journalctl -f | lnav
# Error ve warning seviyelerini filtrele
:filter-in log_level IN ('error', 'warning')
# Docker container logları
docker logs -f myapp | lnav
# Uygulama logları ile sistem loglarını birleştir
lnav /var/log/myapp/*.log /var/log/syslog
# Apache access log performance analizi
lnav /var/log/apache2/access.log
# SQL ile yavaş requestleri bul
:;SELECT cs_uri_stem, avg(duration) as avg_time FROM access_log GROUP BY cs_uri_stem HAVING avg_time > 1000 ORDER BY avg_time DESC
# Tema değiştirme
:config theme monokai
:config theme solarized-dark
:config theme default
# Custom renk ayarları
~/.lnav/configs/default/config.json
# Büyük loglar için bellek kullanımını sınırla
export LNAV_EXP_DISABLE_PRECOMPUTE=1
# Index oluşturmayı devre dışı bırak (hız için)
lnav --no-index /var/log/huge.log
# Sadece son N satırı yükle
tail -n 10000 /var/log/big.log | lnav
Problem: Log formatı tanınmıyor Çözüm: Manual format belirtme
:open /path/to/log.txt syslog
Problem: Çok yavaş yükleniyor Çözüm: Streaming mode kullan
tail -f /var/log/big.log | lnav -
Problem: UTF-8 karakter sorunu Çözüm: Encoding belirt
export LC_ALL=en_US.UTF-8
lnav /var/log/app.log
#!/bin/bash
# lnav-monitor.sh
ERROR_COUNT=$(lnav -n -c ':;SELECT count(*) FROM all_logs WHERE log_level="error" AND log_time >= datetime("now", "-5 minutes")' /var/log/app.log)
if [ $ERROR_COUNT -gt 0 ]; then
    echo "ALERT: $ERROR_COUNT errors in last 5 minutes"
    # Send notification
fi
# Log metrics export
lnav -c ':;SELECT log_level, count(*) FROM all_logs WHERE log_time >= datetime("now", "-1 hour") GROUP BY log_level' -n /var/log/app.log | while read level count; do
    echo "log_entries_total{level=\"$level\"} $count"
done
# lnav + jq + curl ile basit log aggregation
lnav -c ':;SELECT * FROM all_logs WHERE log_level="error"' -n /var/log/*.log | jq -r '. | {timestamp, level, message}' | curl -X POST -H "Content-Type: application/json" -d @- http://logserver/api/logs
# JSON output ile Grafana'ya veri gönderme
lnav -c ':;SELECT strftime("%Y-%m-%d %H:00:00", log_time) as hour, count(*) FROM all_logs GROUP BY hour' -n /var/log/app.log
# Regex ile filtreleme
:filter-in log_body REGEXP 'user_id:\s*(\d+)'
# IP adresi pattern'i
:filter-in c_ip REGEXP '^192\.168\.'
# Java stack trace gibi multi-line loglar için
:config show-time-offset true
# Filtered logları export et
:write-csv-to /tmp/filtered_logs.csv
:write-json-to /tmp/logs.json
# Screenshot benzeri text export
:write-to /tmp/log_snapshot.txt
// ~/.lnav/configs/default/keymap.json
{
  "key-map": {
    "x": ":toggle-view",
    "ctrl-r": ":reset-session"
  }
}

lnav, log analizi için güçlü ve kullanışlı bir araçtır. Özellikle:
tail -f yerine lnav -f kullanınLog analizi artık karmaşık bir süreç olmak zorunda değil. lnav ile tail, grep, less döngüsünden kurtulun ve log'larınızı saniyeler içinde analiz edin!
Bu rehber lnav v0.11+ sürümü baz alınarak hazırlanmıştır. En son özellikler için GitHub repository'yi takip edin.
Etiketler: linux, lnav, logs, observability, sysadmin, devops, sre, terminal, dashboard, monitoring