GCP Cloud Logging ile Log Yönetimi
Üretim ortamında bir sorun çıktığında, ilk içgüdün logları karıştırmak olur. Ama loglar dağınık, format tutarsız ya da hiç toplanmıyorsa, o kritik anında kör uçuş yaparsın. GCP Cloud Logging, Google’ın bu problemi çözmek için sunduğu merkezi log yönetim platformu. Sadece bir log görüntüleyici değil; toplama, filtreleme, yönlendirme, arşivleme ve alarm üretme konularında uçtan uca bir çözüm. Bu yazıda, Cloud Logging’i gerçekten nasıl kullanman gerektiğini, hangi tuzaklardan kaçınman gerektiğini ve üretime hazır bir log altyapısını nasıl kuracağını detaylıca ele alacağız.
Cloud Logging Nedir ve Neden Önemlidir?
GCP’de çalışan her servis, varsayılan olarak loglarını Cloud Logging’e gönderir. Compute Engine instance’ların, GKE pod’ların, Cloud Functions’ların, Cloud Run servislerinin hepsi buraya bağlıdır. Buna otomatik log entegrasyonu deniyor ve bu gerçekten büyük bir kolaylık sağlıyor.
Ama mesele sırf log toplamaktan ibaret değil. Gerçek sysadmin işi şunları kapsar:
- Log’ların nereye gittiğini kontrol etmek (sink yönetimi)
- Gereksiz logları filtreleyerek maliyet düşürmek
- Log tabanlı metrik ve alarm oluşturmak
- Uyumluluk ve audit gereksinimleri için log arşivlemek
- Uygulama loglarını yapılandırılmış (structured) formata çekmek
Cloud Logging’in temel bileşenlerini şöyle özetleyebilirim:
- Log Explorer: Web tabanlı log sorgulama arayüzü
- Log Sinks: Logları farklı hedeflere yönlendiren kurallar
- Log Buckets: Logların saklandığı depolama birimleri
- Log Router: Gelen logları kurallara göre yönlendiren motor
- Log-Based Metrics: Log verilerinden türetilen metrikler
gcloud CLI ile Cloud Logging’e Başlamak
Her şeyden önce, gcloud CLI kurulu ve authenticate edilmiş olmalı. Log yönetimi işlemlerinin büyük çoğunluğunu terminal üzerinden yapacağız çünkü GUI’de tıklamak her seferinde aynı şeyi yapmak zorunda kaldığında çok yorucu olur.
# Mevcut projedeki log listesini çek
gcloud logging logs list
# Belirli bir servisin loglarını oku (son 1 saatin logları)
gcloud logging read "resource.type=gce_instance"
--freshness=1h
--project=my-production-project
# Spesifik bir instance'ın ERROR loglarını filtrele
gcloud logging read
'resource.type="gce_instance" AND severity>=ERROR AND resource.labels.instance_id="1234567890"'
--freshness=2h
--limit=50
--format=json
--freshness parametresi zaman aralığını belirtir, 1h, 6h, 1d gibi değerler alabilir. --limit ise kaç log satırı döneceğini kontrol eder. Production ortamında --limit olmadan sorgu çalıştırmak istemezsin, bazen yüz binlerce kayıt dönebilir.
Yapılandırılmış Log Yazmak
Uygulama loglarınızı düz metin olarak mı yazıyorsunuz? Lütfen durdurun. Yapılandırılmış (structured) loglar, Cloud Logging’in arama ve filtreleme özelliklerinden tam anlamıyla yararlanmanızı sağlar.
# Python uygulamasından structured log gönderme örneği
# (Cloud Logging client library kullanarak)
cat > /opt/myapp/logger_example.py << 'EOF'
import google.cloud.logging
import logging
import json
client = google.cloud.logging.Client()
client.setup_logging()
# Bu şekilde structured log yazabilirsiniz
logging.info("User login successful", extra={
"json_fields": {
"user_id": "usr_12345",
"ip_address": "192.168.1.100",
"auth_method": "oauth2",
"session_duration": 3600
}
})
EOF
Eğer Python değil de shell script’lerden log atmanız gerekiyorsa, gcloud logging write komutunu kullanabilirsiniz:
# Shell script içinden structured log yazma
gcloud logging write my-app-log
'{"user_id": "usr_12345", "action": "file_upload", "file_size_mb": 150, "status": "success"}'
--severity=INFO
--payload-type=json
--project=my-production-project
# Basit text log yazma
gcloud logging write my-app-log
"Backup tamamlandi: $(date '+%Y-%m-%d %H:%M:%S')"
--severity=INFO
Log Sink’leri Yönetmek
Log sink’leri, Cloud Logging’in en kritik özelliklerinden biridir. Gelen logları BigQuery’ye, Cloud Storage’a, Pub/Sub’a ya da başka bir Cloud Logging bucket’ına yönlendirebilirsiniz.
Tipik bir senaryo: Audit loglarını compliance için Cloud Storage’a arşivleyin, uygulama hatalarını BigQuery’ye analiz için gönderin ve kritik alarmlar için Pub/Sub üzerinden notification pipeline kurun.
# Cloud Storage'a log sink oluşturma (audit logları için)
gcloud logging sinks create audit-logs-archive
storage.googleapis.com/my-audit-logs-bucket
--log-filter='logName:"cloudaudit.googleapis.com"'
--project=my-production-project
# BigQuery'ye log sink oluşturma (uygulama hataları için)
gcloud logging sinks create app-errors-bigquery
bigquery.googleapis.com/projects/my-production-project/datasets/app_logs
--log-filter='severity>=ERROR AND resource.type="gce_instance"'
--project=my-production-project
# Mevcut sink'leri listele
gcloud logging sinks list --project=my-production-project
# Sink detaylarını görüntüle
gcloud logging sinks describe audit-logs-archive --project=my-production-project
Sink oluşturduktan sonra mutlaka yapmanız gereken bir adım var: Sink’in kullandığı servis hesabına hedef kaynağa yazma yetkisi vermeniz gerekiyor. Bunu sık sık atlayan adminler olur ve sonra neden loglar gelmiyor diye saatlerce uğraşırlar.
# Sink'in servis hesabını öğren
SINK_SA=$(gcloud logging sinks describe audit-logs-archive
--project=my-production-project
--format='value(writerIdentity)')
echo "Sink service account: $SINK_SA"
# Cloud Storage bucket'a yazma yetkisi ver
gsutil iam ch ${SINK_SA}:objectCreator gs://my-audit-logs-bucket
Log Tabanlı Metrik ve Alarm Oluşturma
Cloud Logging sadece log depolamak için değil, loglardan metrik üretmek için de kullanılır. Bu özellik, özellikle uygulama seviyesindeki hataları izlemek için çok değerlidir.
Gerçek bir senaryo düşünelim: Production’da bir servisimizin belirli bir hata mesajı üretip üretmediğini izlemek istiyoruz. 5 dakika içinde 10’dan fazla bu hata görünürse alarm üretsin istiyoruz.
# Log tabanlı metrik oluşturma
gcloud logging metrics create payment-service-errors
--description="Payment service critical errors count"
--log-filter='resource.type="gce_instance" AND textPayload:"PAYMENT_FAILED" AND severity=ERROR'
--project=my-production-project
# Metrik listesini görüntüle
gcloud logging metrics list --project=my-production-project
# Metrik detayı
gcloud logging metrics describe payment-service-errors --project=my-production-project
Bu metriği oluşturduktan sonra Cloud Monitoring üzerinden alerting policy ekleyebilirsiniz. Ama log tabanlı metrik oluştururken şuna dikkat edin: Yüksek kardinaliteli label’lar kullanmaktan kaçının. Örneğin her request için unique bir ID’yi label olarak kullanırsanız, metrik sayısı patlar ve ciddi maliyet oluşur.
Log Exclusion ile Maliyet Optimizasyonu
Cloud Logging’in en can sıkıcı taraflarından biri maliyetidir. Özellikle yüksek trafikli sistemlerde, debug log’ları tutmak astronomik maliyetlere yol açabilir. Log exclusion kuralları ile gereksiz logları filtreleyip maliyetleri düşürebilirsiniz.
# Debug ve Info seviyeli GKE loglarını hariç tut
gcloud logging exclusions create exclude-gke-debug-logs
--description="GKE debug ve info loglarini filtrele"
--log-filter='resource.type="k8s_container" AND severity<=INFO'
--project=my-production-project
# Belirli bir namespace'in loglarını tamamen hariç tut
gcloud logging exclusions create exclude-monitoring-ns
--description="Monitoring namespace loglarini filtrele"
--log-filter='resource.type="k8s_container" AND resource.labels.namespace_name="monitoring"'
--project=my-production-project
# Mevcut exclusion'ları listele
gcloud logging exclusions list --project=my-production-project
# Exclusion'ı güncelle (disable et)
gcloud logging exclusions update exclude-gke-debug-logs
--disabled
--project=my-production-project
Exclusion kuralları yazarken dikkatli olun. Bir exclusion kuraldı hariç tutulan log, hiçbir sink’e gitmez ve geri getirilemez. Bu yüzden kritik olabilecek logları exclusion’a dahil etmeden önce iki kez düşünün.
Pratikte benim önerdiğim yaklaşım: Önce exclusion olmadan bir hafta çalışın ve hangi log tiplerinin en fazla hacim oluşturduğunu analiz edin. Sonra güvenle hariç tutulabilecekleri belirleyin.
Log Bucket Yönetimi ve Retention Politikaları
Varsayılan olarak Cloud Logging, logları _Default bucket’ında 30 gün tutar. Ama compliance gereksinimleriniz daha uzun saklama süreleri gerektirebilir ya da maliyet açısından bazı logları daha kısa süre tutmak isteyebilirsiniz.
# Özel log bucket oluşturma
gcloud logging buckets create long-term-logs
--location=europe-west1
--retention-days=365
--description="Compliance icin uzun donemli log saklama"
--project=my-production-project
# Mevcut bucket'ların listesi
gcloud logging buckets list --project=my-production-project
# Varsayılan bucket'ın retention süresini değiştirme
gcloud logging buckets update _Default
--location=global
--retention-days=60
--project=my-production-project
# Bucket detaylarını görüntüle
gcloud logging buckets describe long-term-logs
--location=europe-west1
--project=my-production-project
Bir log bucket’ı oluşturduktan sonra, bu bucket’a yönlendirecek sink’i de oluşturmanız gerekiyor:
# Özel bucket'a yönlendiren sink oluşturma
gcloud logging sinks create compliance-sink
logging.googleapis.com/projects/my-production-project/locations/europe-west1/buckets/long-term-logs
--log-filter='logName:"cloudaudit.googleapis.com" OR logName:"data_access"'
--project=my-production-project
Ops Agent ile VM Log Toplama
GCP’de Compute Engine instance’lar çalıştırıyorsanız ve uygulama loglarınızı otomatik olarak Cloud Logging’e göndermek istiyorsanız, Ops Agent kurmanız gerekiyor. Bu agent, hem metrik hem de log toplama işini yapıyor.
# Ops Agent kurulum scripti (Debian/Ubuntu için)
curl -sSO https://dl.google.com/cloudagents/add-google-cloud-ops-agent-repo.sh
sudo bash add-google-cloud-ops-agent-repo.sh --also-install
# Ops Agent durumunu kontrol et
sudo systemctl status google-cloud-ops-agent
# Ops Agent konfigürasyon dosyası
sudo cat /etc/google-cloud-ops-agent/config.yaml
Özel uygulama loglarınızı toplamak için Ops Agent’ı konfigüre etmeniz gerekiyor:
# Özel uygulama logu için Ops Agent konfigürasyonu
sudo cat > /etc/google-cloud-ops-agent/config.yaml << 'EOF'
logging:
receivers:
my-app-log:
type: files
include_paths:
- /var/log/myapp/*.log
record_log_file_path: true
processors:
my-app-log-json:
type: parse_json
field: message
time_key: timestamp
time_format: "%Y-%m-%dT%H:%M:%S%z"
service:
pipelines:
my-app-pipeline:
receivers: [my-app-log]
processors: [my-app-log-json]
EOF
# Konfigürasyonu doğrula ve agent'ı yeniden başlat
sudo google-cloud-ops-agent-diagnostics
sudo systemctl restart google-cloud-ops-agent
Log Explorer’da Gelişmiş Sorgular
Cloud Logging’in web arayüzü olan Log Explorer, özellikle üretim sorunlarını araştırırken çok işe yarar. Ama CLI’dan da aynı sorguları çalıştırabilirsiniz. İyi bir log query dili bilgisi, sorun giderme sürenizi dramatik olarak kısaltır.
# Son 24 saatte kritik hataları olan instance'ları bul
gcloud logging read
'severity=CRITICAL AND timestamp>="2024-01-15T00:00:00Z"'
--freshness=24h
--project=my-production-project
--format="table(timestamp,resource.labels.instance_id,textPayload)"
# HTTP 5xx hatalarını filtrele (Cloud Run veya App Engine için)
gcloud logging read
'resource.type="cloud_run_revision" AND httpRequest.status>=500'
--freshness=6h
--project=my-production-project
--format=json | jq '.[] | {time: .timestamp, status: .httpRequest.status, url: .httpRequest.requestUrl}'
# Belirli bir kullanıcının audit loglarını çek
gcloud logging read
'logName="projects/my-production-project/logs/cloudaudit.googleapis.com%2Factivity" AND protoPayload.authenticationInfo.principalEmail="[email protected]"'
--freshness=7d
--project=my-production-project
Sorgu yazarken sık kullandığım birkaç ipucu:
timestampfiltresi her zaman kullanın, aksi takdirde çok büyük veri taranırresource.typeile hedefleyen kaynağı daraltınseverity>=ERRORile sadece hata ve üstü seviyeleri filtreleyin- String aramalarında
=~operatörü regex destekler
Gerçek Dünya Senaryosu: Güvenlik İncelemesi Pipeline’ı
Şimdi gerçek bir örnek kuralım: Başarısız SSH girişimlerini izleyen ve alarm üreten bir sistem.
#!/bin/bash
# security-monitoring-setup.sh
PROJECT_ID="my-production-project"
ALERT_EMAIL="[email protected]"
# 1. Failed SSH attempts için log tabanlı metrik oluştur
gcloud logging metrics create failed-ssh-attempts
--description="Failed SSH login attempts on GCE instances"
--log-filter='resource.type="gce_instance" AND logName:"syslog" AND textPayload:"Failed password" OR textPayload:"Invalid user"'
--project=$PROJECT_ID
echo "Log metric olusturuldu: failed-ssh-attempts"
# 2. Pub/Sub topic oluştur (alarm bildirimleri için)
gcloud pubsub topics create security-alerts
--project=$PROJECT_ID
# 3. Security eventleri için Pub/Sub sink oluştur
gcloud logging sinks create security-events-sink
pubsub.googleapis.com/projects/$PROJECT_ID/topics/security-alerts
--log-filter='resource.type="gce_instance" AND (textPayload:"Failed password" OR textPayload:"Invalid user" OR textPayload:"BREAK-IN ATTEMPT")'
--project=$PROJECT_ID
# 4. Sink service account'a Pub/Sub publisher yetkisi ver
SINK_SA=$(gcloud logging sinks describe security-events-sink
--project=$PROJECT_ID
--format='value(writerIdentity)')
gcloud pubsub topics add-iam-policy-binding security-alerts
--member=$SINK_SA
--role=roles/pubsub.publisher
--project=$PROJECT_ID
echo "Security monitoring pipeline kuruldu!"
echo "Pub/Sub topic: security-alerts"
echo "Log metric: failed-ssh-attempts"
Bu script’i çalıştırdıktan sonra, Cloud Monitoring’de bu metriğe dayalı bir alerting policy oluşturabilirsiniz. 5 dakika içinde 20’den fazla başarısız giriş denemesi varsa, güvenlik ekibine mail gönderilsin gibi kurallar kolayca tanımlanabilir.
Maliyet Takibi ve Optimizasyon İpuçları
Cloud Logging maliyetleri fark edilmeden artabilir. Özellikle büyük GKE cluster’ları çalıştırıyorsanız log hacmi çok hızlı büyür. Bazı pratik öneriler:
- Verbose uygulama loglarını production’da kapatın: DEBUG seviyesindeki logları production ortamında tutmak hem güvenlik riski hem de maliyet problemidir.
- Kısa ömürlü workload loglarını hariç tutun: Batch job’lar, test pipeline’ları gibi kısa ömürlü iş yüklerinin logları genellikle saklanmaya değmez.
- Log sampling uygulayın: Çok yüksek frekanslı INFO loglarınız varsa, yüzde 10 veya yüzde 1 sampling yaparak hacmi düşürebilirsiniz.
- BigQuery’ye export edip Cloud Logging’den silin: Uzun süreli analiz için logları BigQuery’de tutmak Cloud Logging’de tutmaktan çok daha ucuzdur.
- Log bazlı maliyet analizi yapın: Her ay hangi kaynakların ne kadar log ürettiğini inceleyip buna göre exclusion kuralları yazın.
# Proje bazında aylık log hacmini öğrenme
gcloud logging read
'timestamp>="2024-01-01T00:00:00Z"'
--freshness=30d
--project=my-production-project
--format=json | wc -l
# En fazla log üreten resource type'ları bul
gcloud logging read ""
--freshness=24h
--project=my-production-project
--format=json |
jq -r '.[].resource.type' |
sort | uniq -c | sort -rn | head -20
Log Görünürlüğü için IAM Yetkilendirmesi
Takımdaki herkesin tüm loglara erişmesini istemeyebilirsiniz. Özellikle audit logları veya güvenlik logları hassas bilgiler içerebilir. Cloud Logging, granular IAM yetkilendirmesi destekler.
- roles/logging.viewer: Tüm logları okuma yetkisi
- roles/logging.privateLogViewer: Private loglar dahil okuma yetkisi
- roles/logging.logWriter: Sadece log yazma yetkisi
- roles/logging.configWriter: Sink, metrik ve exclusion yönetimi
- roles/logging.admin: Tam yönetim yetkisi
Developer’lara genellikle roles/logging.viewer, uygulamalara ise roles/logging.logWriter vermek mantıklıdır.
Sonuç
Cloud Logging, yüzeysel bakıldığında basit bir log görüntüleme aracı gibi durur. Ama derine inince, log yönetiminin her katmanını kapsayan oldukça güçlü bir platform olduğunu görürsünüz. Doğru sink konfigürasyonları ile hem maliyet optimizasyonu yapabilir hem de compliance gereksinimlerinizi karşılayabilirsiniz. Structured logging alışkanlığını geliştirmek, sorun giderme sürelerinizi yarıya indirir. Log tabanlı metrikler ile monitoring sisteminizi zenginleştirir, loglardan doğrudan alarm üretebilirsiniz.
En önemli tavsiyem şu: Log mimarinizi proaktif olarak kurun, reaktif olmayın. Bir production krizi sırasında sink kurmaya, retention policy ayarlamaya ya da hangi logu nerede bulacağınızı çözmeye çalışmak gereksiz stres yaratır. Şimdi bir saatinizi bu yapıyı kurmaya harcayın, ileride kendinize teşekkür edersiniz.
