Ana içeriğe geç
Modül 8 · Ders 2 ders 4Kurstaki 30/32~12 min
Modül dersleri (2/4)

Apache günlük ayrıştırıcısı

Apache günlükleri (birleşik format) kesin bir yapıya sahiptir:

Code
127.0.0.1 - - [10/Oct/2024:13:55:36 +0000] "GET /index.html HTTP/1.1" 200 1234

Adlandırılmış gruplara sahip bir model, her alanı tek seferde çıkarır:

Code
^(?<ip>\d+\.\d+\.\d+\.\d+)\s+\S+\s+\S+\s+\[[^\]]+\]\s+"(?<metodo>\w+)\s+(?<path>\S+)\s+\S+"\s+(?<status>\d+)\s+(?<size>\d+)

Korkunç görünüyor ama basit kalıpların birleştirilmesi:

  • (?<ip>\d+\.\d+\.\d+\.\d+) -- kaynak IPv4.
  • \s+\S+\s+\S+ -- kullanıcı kimlikleri (genellikle -).
  • \[[^\]]+\] -- köşeli parantez içindeki tarih.
  • "(?<metodo>\w+)\s+(?<path>\S+)\s+\S+" -- HTTP yöntemi, yolu ve sürümüyle tırnak içindeki istek.
  • (?<status>\d+)\s+(?<size>\d+) -- durum kodu ve gönderilen bayt sayısı.

Genel strateji

  1. Gerçek çizgiden başlayın ve sınırlayıcıları sabitleyin: boşluklar, tırnak işaretleri, köşeli parantezler.
  2. Sınırlayıcılar arasında, belirtecin türünü tanımlayın (IP, kelime, sayı).
  3. Adlandırılmış gruplara sarın Yalnızca çıkarmanız gerekenleri.

Karmaşık günlükleri ayrıştırma

Günlük ayrıştırmada alanlar, tırnak içine alınmış dizeler veya köşeli parantezler (örneğin, kullanıcı aracısı) içermeleri dışında genellikle boşlukla ayrılır. Joker karakter noktası yerine hariç tutulan karakter sınıflarının kullanılması, birden çok sütunun hatalı şekilde birleştirilmesini önler.

Deneyin

Egzersiz#regex.m8.l2.e1
Denemeler: 0Yükleniyor…

Her günlük satırının başlangıcındaki IPv4'ü adlandırılmış bir grup "ip" olarak çıkarın.

Düzenleyici yükleniyor…
İpucu göster

^ ve m bayrağıyla satırın başlangıcına sabitleyin ve IP'yi (?<ip>...) içine sarın.

3 denemeden sonra çözüm mevcut

Alıştırmayı gözden geçirin

Egzersiz#regex.m8.l2.e2
Denemeler: 0Yükleniyor…

İsteğin HTTP yöntemini ve yolunu tırnak işaretleri arasında "metodo" ve "yol" grupları olarak çıkarın.

Düzenleyici yükleniyor…
İpucu göster

" ile açın, ardından (?<metodo>\\w+)\\s+(?<path>\\S+).

3 denemeden sonra çözüm mevcut

Ek zorluk

Egzersiz#regex.m8.l2.e3
Denemeler: 0Yükleniyor…

Extract only the date and time part enclosed in brackets in logs, e.g. `10/Oct/2024:13:55:36 +0000`, as a named group `timestamp`.

Düzenleyici yükleniyor…
İpucu göster

Use \[(?<timestamp>[^\]]+)\] to prevent the engine from matching past the closing bracket.

3 denemeden sonra çözüm mevcut