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