Konuyu Açan #1
Shell Betiklerinde Günlükleme

Giriş ve neden önemli
Bir betiğin çalışması sırasında ortaya çıkan olayları izlemek, hata tespiti ve performans analizi için hayati olabilir. Shell betiklerindeki günlükleme (logging) temel olarak hangi adımların gerçekleştiğini, hangi değerlerin atandığını ve hangi durumlarda hataların ortaya çıktığını kaydetmek anlamına gelir. Özellikle planlanmış görevler (cron) veya uzun süre çalışması gereken işlerde günlük kaydı, sistem güvenilirliği ve bakımı için kritik bir pratiktir.

1. Basit günlük yapısı ve çıktı yönlendirme
En temel yaklaşım, betiğin akışını standart çıkışa ve hata çıktısına yazmaktır. Örnek olarak:
KOD
1234567891011121314151617181920
#!/bin/bash
LOGFILE="/var/log/myscript.log"

log() {
  local msg="$1"
  echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] $msg" >> "$LOGFILE"
}

error() {
  local msg="$1"
  echo "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] $msg" 1>>"$LOGFILE" 2>&1
}

log "Beti başlatıldı."
[b]Bir işlem[/b]
if [ ! -d "/var/www/html" ]; then
  error "Kök dizin bulunamadı."
fi
log "Betik sonlandı."

Bu temel yapı, günlük dosyasının belirli bir formatta zaman damgası içermesini sağlar ve hata durumunda ayrı bir etiketle kaydı ayırır.

2. Günlüğe ayrıntı düzeyi eklemek
Günlük seviyelerini tanımlayarak esneklik elde edebilirsiniz:
KOD
1234567891011
LOGLEVEL=${LOGLEVEL:-INFO}  # DEBUG, INFO, WARN, ERROR

log_debug() { [ "$LOGLEVEL" = "DEBUG" ] && log "DEBUG: $1"; }
log_warn()  { log "WARN: $1"; }
log_err()   { log "ERROR: $1"; }

log "Betik çalışıyor."
log_debug "Değişkenler: VAR1=${VAR1}, VAR2=${VAR2}"
log_warn "Kritik olmayan sorun var gibi görünüyor."
log_err "İşlem başarısız oldu."

Bu yaklaşım, prodüksiyon ortamında aşırı ayrıntı yerine gerekli seviyeyi seçmenize olanak tanır.

3. Zaman damgası ve kaynak dosya/konumları
Olayların nereden geldiğini takip etmek için olay kaynağını belirtmek faydalı olur:
KOD
1234567
log() {
  local level="$1"; shift
  echo "$(date '+%Y-%m-%d %H:%M:%S') [$level] $*"
}
log "INFO" "Betik başlatıldı." >> "$LOGFILE"
log "INFO" "İşlem başladı: $(basename "$0")"

Böylece hangi betikten hangi satırın kaydedildiğini hızlıca görebilirsiniz.

4. Rotasyon ve saklama politikası
Günlük dosyaları büyüdükçe yönetimi zorlaşabilir. Basit bir yaklaşım:
  • Günlük dosyasını günlük olarak yeniden adlandırmak ve eski dosyaları sıkıştırmak.
  • Son 7 veya 14 günlük dosyayı saklamak; daha eski olanları silmek.


5. Cron ile günlükleme ve güvenlik
Cron üzerinden çalışan betiklerde çıktı yönlendirmesi kritik. Log dosyasına yazarken izinlerin uygun olduğundan emin olun. Ayrıca sensitif verilerin (şifreler, API anahtarları) loga yazılmamasına dikkat edin. Şu şekilde filtrelemek güvenli olabilir:
KOD
12345678910
LOGKEYS="password|apikey|token"
log_privileged() {
  local msg="$1"
  if echo "$msg" | grep -Ei "$LOGKEYS" >/dev/null; then
    log "WARN" "Gizli veri içerir; kaydedilmeyecek."
  else
    log "INFO" "$msg"
  fi
}


6. Gelişmiş yönlendirme: stdout/stderr'i bir araya getirme
Betik çalıştırılırken tüm çıktıların tek bir dosyada toplanması istenir:
KOD
1234
exec >>"$LOGFILE" 2>&1
echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] Betik çalışıyor..."
[b]buradan gelen tüm çıktı otomatik olarak loga gider[/b]


Sonuç ve kapanış
Günlükleme, betiğinizin davranışını anlamanızı kolaylaştırır ve sorunlarda hızlı rehberlik sağlar. Uygun log seviyesi, güvenli çıktı yönetimi ve basit rotasyon politikasıyla pratik ve güvenilir bir günlükleme kurarsınız. Bu konudaki deneyimlerinizi ve hangi stratejileri kendi ortamınızda benimsediğinizi paylaşabilir misiniz?

Yanıt vermek için giriş yapmış olmalısınız.

Bu konuyu görüntüleyen kullanıcılar (Toplam: 1, Üyeler: 1, Misafirler: 0)
Toplam: 1 (üyeler: 1, misafirler: 0)
0 alıntı seçildi