0Pricing
DevOps Bootcamp · Ders

Web ve Uygulama Günlüklerini Büyük Ölçekte Ayrıştırma

grep, cut ve awk kullanarak erişim günlüklerinden durum kodlarını, gecikmeleri ve istemci alanlarını çıkarın.

Web ve Uygulama Günlüklerini Büyük Ölçekte Ayrıştırma, CoddyKit'te ücretsiz bir DevOps Bootcamp dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, DevOps Bootcamp öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. DevOps Bootcamp kursu toplamda 4 dersten oluşur.

Web Erişim Günlüğü Nedir?

Her HTTP sunucusu (Apache, Nginx, Caddy), her istek için bir erişim günlüğüne bir satır yazar. Bu satırların yapısını anlamak, tüm günlük çözümleme çalışmalarının temelidir.

Tipik bir Birleşik Günlük Biçimi (CLF) satırı şöyledir:

  • İstemci IP'si — isteği yapan
  • Zaman damgası — isteğin gerçekleştiği zaman
  • İstek satırı — yöntem, yol, iletişim kuralı
  • Durum kodu — HTTP yanıtı (200, 404, 500…)
  • Gönderilen baytlar — yanıt gövdesinin boyutu
  • Yönlendiren — kaynak sayfa
  • Kullanıcı aracısı — tarayıcı veya bot dizesi

/var/log/nginx/access.log dosyasından örnek satır:

192.168.1.10 - alice [11/Jun/2026:14:32:01 +0000] "GET /api/orders HTTP/1.1" 200 1482 "-" "curl/7.88.1"

Ölçek büyüdüğünde bu dosyalar günde milyonlarca satıra ulaşır. Bu dersin amacı, standart BASH araçlarını kullanarak bu dosyalardaki alanları verimli biçimde ayıklamak, filtrelemek ve toplulaştırmaktır.

tail ve grep ile Canlı Günlükten Örnekleme

Herhangi bir işlem hattı yazmadan önce, yapısını anlamak için günlüğü inceleyin. tail canlı bir akışı izlemenizi, grep ise akışı hemen ilgili satırlara daraltmanızı sağlar.

Yaygın kalıplar:

  • tail -n 1000 access.log — son 1000 satır
  • tail -f access.log — gerçek zamanlı izleme
  • tail -f access.log | grep '" 5' — geldikleri anda yalnızca 5xx hataları

Temel nokta, grep komutunun eşleşmeyi satırın tamamına göre yapmasıdır; bu nedenle kalıbı doğru konumlandırmak önemlidir. ' 500 ' (boşluklarla birlikte) eşleşmesini kullanmak, 500 dizesini içeren bir URL yolunun yanlışlıkla eşleşmesini önler.

#!/usr/bin/env bash
# Watch only HTTP 5xx errors arriving in real time
tail -f /var/log/nginx/access.log \
  | grep --line-buffered '" 5[0-9][0-9] '

cut ile Durum Kodunu Ayıklama

cut, her satırı bir ayırıcıya göre böler ve seçilen alanları yazdırır. Birleşik Günlük Biçimi'nde, boşluklara göre böldüğünüzde durum kodu 9. alanda yer alır; ancak istek satırının çevresindeki tırnaklar nedeniyle, bilinen bir sabit noktadan saymak daha güvenlidir.

Güvenilir bir yöntem şudur: İstek satırı her zaman tırnak içine alındığından, durum kodu istek alanını kapatan tırnaktan sonraki ilk belirteçtir. cut -d'"' -f3 kullanmak, istek tırnağından sonraki her şeyi ayıklar; ardından ikinci cut -d' ' -f2 durum kodunu seçer.

Bu iki aşamalı cut kullanımı, CLF günlükleri için klasik bir deyimdir: hızlıdır ve harici bağımlılığı yoktur.

#!/usr/bin/env bash
# Print only the HTTP status code from each log line
# Input format: ... "GET /path HTTP/1.1" 200 1482 ...
cut -d'"' -f3 /var/log/nginx/access.log \
  | cut -d' ' -f2 \
  | sort \
  | uniq -c \
  | sort -rn

awk ile Durum Kodlarını Sayma

awk, satırlar arasında durumu koruyabildiği için cut'tan daha güçlüdür. Oluşumları saymak için kullanılan deyimsel kalıp, ilgilendiğiniz değeri anahtar olarak kullanan ilişkisel bir dizidir.

CLF'de boşluklarla ayrılmış 1 tabanlı $9 alanı durum kodudur. awk her satırı işler, bir sayacı artırır ve ardından sıralanmış özeti END bloğunda yazdırır.

Neden cut | sort | uniq -c yerine awk tercih edilmeli? Çünkü awk, dosyanın tamamını önce sıralamadan, tek geçişte işi tamamlar; günlük yüzlerce gigabayt olduğunda bu kritik önem taşır.

#!/usr/bin/env bash
# Count HTTP status codes in a single awk pass
awk '{ count[$9]++ }
END {
  for (status in count)
    printf "%6d  %s\n", count[status], status
}' /var/log/nginx/access.log \
  | sort -rn

Hataları Filtreleme ve İstemci IP'lerini Ayıklama

En yaygın operasyon görevlerinden biri, en çok hatayı üreten istemci IP'lerini bulmaktır. Bu işlem filtrelemeyi (yalnızca hata satırlarını alma) ve alan ayıklamayı (1. alandaki IP'yi alma) birleştirir.

İşlem hattı stratejisi:

  • Durum kodu aralığına göre filtrelemek ve IP'yi tek adımda ayıklamak için awk kullanın; ayrı bir grep geçişinden kaçının
  • Hızlı bir en yüksek-N görünümü için sort | uniq -c | sort -rn | head komutlarına aktarın

Bu kalıp, dosyayı belleğe yüklemeden tek bir sunucudaki 10 GB'lık bir günlük dosyasında çalışacak kadar hızlıdır.

#!/usr/bin/env bash
# Top 10 IPs generating HTTP 4xx or 5xx errors
awk '$9 ~ /^[45][0-9][0-9]$/ { print $1 }' \
    /var/log/nginx/access.log \
  | sort \
  | uniq -c \
  | sort -rn \
  | head -10

Uygulama Günlüklerinden Yanıt Gecikmesini Ayrıştırma

Uygulama sunucuları (Rails, Gunicorn, morgan kullanan Express vb.) genellikle istek süresini günlüğe kaydeder. Nginx, her satırın sonuna ek bir alan olarak $request_time yazacak şekilde yapılandırılabilir.

nginx.conf içindeki özel bir Nginx günlük biçimi örneği:

log_format timed '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" rt=$request_time';

Gecikme günlüğe alındıktan sonra, verileri bir veritabanına yüklemeden milyonlarca istek üzerinden ortalama, en yüksek değer ve yüzdelik dilim yaklaşımlarını hesaplamak için awk kullanabilirsiniz.

#!/usr/bin/env bash
# Compute average and max request_time from Nginx timed log
# Assumes last field is rt=<seconds> e.g. rt=0.042
awk '{
  # Extract numeric value after rt=
  n = split($NF, a, "=")
  if (n == 2 && a[1] == "rt") {
    t = a[2] + 0
    sum += t
    count++
    if (t > max) max = t
  }
}
END {
  if (count > 0)
    printf "Requests: %d  Avg: %.4fs  Max: %.4fs\n", count, sum/count, max
}' /var/log/nginx/timed_access.log

awk ile Gecikme Histogramı Oluşturma

Tek bir ortalama, kuyruk gecikmesini gizler. Bir histogram dağılımı ortaya çıkarır: isteklerin çoğunun hızlı, birkaçının ise çok yavaş mı olduğunu (uzun kuyruk) yoksa dağılımın düzenli mi olduğunu gösterir.

Yöntem, her değeri awk içinde tamsayı aritmetiği kullanarak yuvarlanmış bir aralığa yerleştirmektir. Saniyeleri milisaniyeye dönüştürmek için 1000 ile çarpmak ve ardından tamsayı bölmesi yapmak, düzenli kova sınırları sağlar.

Bu işlem, doğrudan bir terminalde okuyabileceğiniz metin tabanlı bir histogram üretir; hızlı bir inceleme için verileri Grafana'ya göndermekten çoğu zaman daha hızlıdır.

#!/usr/bin/env bash
# Latency histogram (50ms buckets) from Nginx timed log
awk '{
  n = split($NF, a, "=")
  if (n == 2 && a[1] == "rt") {
    ms = int(a[2] * 1000)      # convert to ms
    bucket = int(ms / 50) * 50 # round down to 50ms boundary
    hist[bucket]++
  }
}
END {
  for (b in hist)
    printf "%6dms  %d\n", b, hist[b]
}' /var/log/nginx/timed_access.log \
  | sort -n

Kullanıcı Aracısını Ayıklama ve Botları Belirleme

Kullanıcı aracısı alanı (" ile bölündüğünde 6. alan), istemcileri tanımlar. Tarayıcılar, veri toplayıcılar ve kötü amaçlı botlar metriklerinizi kirletebilir ve hata sayılarını şişirebilir. Bunları filtrelemek, gerçek kullanıcı trafiğinin daha temiz bir görünümünü sağlar.

Yaygın bot imzaları: bot, crawler, spider, curl, python-requests, Googlebot, Bingbot.

Bilinen botları dışlamak için grep -iv (büyük-küçük harfe duyarsız ters eşleştirme) kullanın veya " ile bölmek ve UA alanında doğrudan eşleştirme yapmak için awk kullanın.

#!/usr/bin/env bash
# Count top 15 User-Agent strings, excluding known bots
awk -F'"' '{ print $6 }' /var/log/nginx/access.log \
  | grep -iv -e 'bot' -e 'crawler' -e 'spider' -e 'curl' \
              -e 'python' -e 'wget' -e 'Go-http-client' \
  | sort \
  | uniq -c \
  | sort -rn \
  | head -15

Uç Noktaya Göre Trafiği Toplulaştırma

Hangi uç noktaların en fazla trafiği aldığını ve en çok hatayı ürettiğini bilmek, iyileştirmelere ve kapasite planlamasına öncelik vermeye yardımcı olur. İstek yolu, tırnak içine alınmış istek alanında bulunur.

" ile bölün, 2. alanı (istek satırını) alın, ardından yolu ayıklamak için yöntemi ve iletişim kuralını çıkarın. /users/12345 gibi yol parametreleri içeren API'lerde, sed veya daha karmaşık bir awk kalıbı kullanarak kimlikleri /users/:id biçiminde normalleştirmek de isteyebilirsiniz.

#!/usr/bin/env bash
# Top 20 requested endpoints (method + path, no query string)
awk -F'"' '{ print $2 }' /var/log/nginx/access.log \
  | awk '{ print $1, $2 }' \
  | sed 's|/[0-9][0-9]*\b|/:id|g' \
  | sort \
  | uniq -c \
  | sort -rn \
  | head -20

awk ile Hataları Uç Noktalarla İlişkilendirme

En güçlü tek geçişli çözümleme, aynı anda birden çok alanı birleştirir: uç nokta, durum kodu ve isteğe bağlı olarak gecikme. Bileşik değerleri anahtar olarak kullanan awk ilişkisel dizileri bu işlemi temiz ve hızlı hale getirir.

Aşağıdaki kalıp, uç nokta başına 5xx hatalarını tek geçişte sayar; geçici dosya kullanılmaz ve en sona kadar ara sıralama yapılmaz. Büyük bir günlükte bir dakikadan kısa sürede yanıt almanız gerektiğinde üretim ortamlarındaki gözlemlenebilirlik betiklerinde kullanılan yaklaşım budur.

#!/usr/bin/env bash
# Count 5xx errors per endpoint path in a single pass
awk -F'"' '{
  # $2 = request line e.g. "GET /api/orders HTTP/1.1"
  # $0 in original space-split: $9 = status
  split($0, fields, " ")
  status = fields[9]
  if (status ~ /^5/) {
    split($2, req, " ")
    path = req[2]
    # Normalise numeric IDs
    gsub(/\/[0-9]+/, "/:id", path)
    errors[path]++
  }
}
END {
  for (p in errors)
    printf "%6d  %s\n", errors[p], p
}' /var/log/nginx/access.log \
  | sort -rn \
  | head -20

Döndürülmüş ve Sıkıştırılmış Günlükleri İşleme

Çoğu sunucuda günlükler her gün döndürülür. Eski dosyalar access.log.1.gz, access.log.2.gz vb. adlarla gzip kullanılarak sıkıştırılır. Standart araçlar bu dosyaları doğrudan okuyamaz; ancak iki yaklaşım sorunsuz çalışır:

  • zcat — stdout'a açar ve işlem hattınıza aktarır
  • zgrep — gzip dosyalarının içinde açma işlemi yapmadan doğrudan grep uygular

Sıkıştırılmamış ve sıkıştırılmış dosyaları birlikte kapsayan tam bir haftalık günlükleri çözümlemek için işlem ikamesi kullanın veya dosyaları zcat ile birleştirin. Aşağıdaki kod parçası, son 7 döndürülmüş dosyayı ve güncel canlı günlüğü tek bir awk çağrısında işler; geçici dosyaya gerek duymaz.

#!/usr/bin/env bash
# Aggregate status codes across a week of rotated logs
# Handles both plain and gzip-compressed rotation files

LOG_DIR="/var/log/nginx"

{
  cat  "${LOG_DIR}/access.log" 2>/dev/null
  zcat "${LOG_DIR}/access.log".*.gz 2>/dev/null
} | awk '
{ count[$9]++ }
END {
  for (s in count)
    printf "%6d  %s\n", count[s], s
}' | sort -rn

Birleşik Günlük Biçimi'nde HTTP durum kodunu hangi awk alanı içerir?

awk ile Birleştirilmiş Günlük Biçimi (boşluklarla ayrılmış ve istek satırı tırnak içine alınmış) kullanan standart bir Nginx erişim günlüğünden yalnızca HTTP 4xx yanıtlarını filtreleyen tek satırlık bir komut yazıyorsunuz. HTTP durum kodunu hangi alan numarası doğru şekilde belirtir?

Ders Özeti: Günlük Analizi İş Akışları

Bu derste yalnızca standart BASH yardımcı programlarını kullanarak web ve uygulama günlüklerini büyük ölçekte analiz etmek için eksiksiz bir araç seti oluşturdunuz.

Ele alınan temel teknikler:

  • Önce yapı — Birleştirilmiş Günlük Biçimi öngörülebilir bir alan düzenine sahiptir; bu düzeni bilmek, cut -d'"' veya awk alan başvurularıyla güvenilir şekilde bölme yapmanızı sağlar.
  • Durum kodu çıkarma — awk '{ count[$9]++ }' tek geçişte tüm kodları sayar; sunucu hatalarını filtrelemek için $9 ~ /^5/ kullanın.
  • Gecikme analizi — Harici bir araç kullanmadan ortalamaları, en yüksek değerleri ve histogram aralıklarını hesaplamak için özel rt= alanını awk ile ayrıştırın.
  • İstemci ve bot analizi — User-Agent alanına ulaşmak için -F'"' ile " üzerinden bölün; toplulaştırmadan önce botları hariç tutmak için grep -iv üzerinden yönlendirin.
  • Uç nokta normalleştirme — Sayımdan önce parametre içeren yolları tek biçime indirmek için awk içinde gsub(/\/[0-9]+/, "/:id") kullanın.
  • Döndürülen günlükler — Tüm döndürülmüş günlük dosyalarını tek bir iş akışı geçişine aktarmak için bir alt kabukta cat ve zcat komutlarını birleştirin.

Bu kalıplar birlikte kullanılabilir: yüz milyonlarca satırı standart donanım üzerinde işleyen tek bir iş akışında filtreleme, çıkarma, normalleştirme ve toplulaştırmayı zincirleyebilirsiniz. Bu temel yapı taşlarında ustalaştığınızda, anlık olay incelemeleri için özel bir günlük toplama hizmetine nadiren ihtiyaç duyarsınız.

Sıkça Sorulan Sorular

“Web ve Uygulama Günlüklerini Büyük Ölçekte Ayrıştırma” dersi ücretsiz mi?

Evet — “Web ve Uygulama Günlüklerini Büyük Ölçekte Ayrıştırma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve DevOps Bootcamp kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. DevOps Bootcamp kursu toplamda 4 dersten oluşur.

“Web ve Uygulama Günlüklerini Büyük Ölçekte Ayrıştırma” dersinde ne öğreneceğim?

grep, cut ve awk kullanarak erişim günlüklerinden durum kodlarını, gecikmeleri ve istemci alanlarını çıkarın. DevOps Bootcamp ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

DevOps Bootcamp öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te DevOps Bootcamp, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“Web ve Uygulama Günlüklerini Büyük Ölçekte Ayrıştırma” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu DevOps Bootcamp dersinde kod yazıp çalıştırabilir miyim?

Evet. Her DevOps Bootcamp dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Web ve Uygulama Günlüklerini Büyük Ölçekte Ayrıştırma
  2. Gerçek Zamanlı Günlük Takibi ve Akış Uyarıları
  3. Betiklerde journalctl ile journald Sorgulama
  4. Günlük Akışlarından Ölçümler ve Histogramlar Hesaplama
← DevOps Bootcamp Sayfasına Dön