Python’da Regex Ustalık Sınıfı: Karmaşık Log Dosyalarını Düzenli Veriye Dönüştürmek

Sistem yönetimi veya backend geliştirme ile uğraşıyorsanız, karşınıza çıkan o devasa, okunması imkansız log dosyalarını bilirsiniz. Binlerce satır arasında kaybolmuş tek bir hata kodunu aramak, bazen samanlıkta iğne aramaya benzer. Peki, bu kaosun içinden saniyeler içinde anlamlı tablolar ve yapılandırılmış veriler çıkarabileceğinizi söylesem?

Log Ayrıştırma Motoru: Kaosu Düzenlemek

Bu projenin merkezinde, ham metin yığınlarını alıp onları temiz Python sözlüklerine (dictionary) dönüştüren bir “Log Ayrıştırma Motoru” yer alıyor. Genellikle sunucu kayıtları, güvenlik duvarı dökümleri veya uygulama hataları gibi veriler, insan gözüyle okunabilmek için tasarlanmış olsa da, bir program tarafından işlenmek için çok “gürültülüdür”.

Motorumuz, her satırı belirli bir şablona göre analiz eder. Sadece “burada bir hata var” demekle kalmaz; hatanın ne zaman gerçekleştiğini, hangi bileşenden geldiğini, hangi IP adresinin buna sebep olduğunu ve varsa özel hata kodunu (status code) tek bir işlemle ayıklar. Bu yaklaşım, özellikle büyük veri setlerinde analiz yapmak veya otomatik alarm sistemleri kurmak istediğinizde hayati önem taşır.

Kodun Anatomisi

Regex (Düzenli İfadeler), başlangıçta korkutucu görünebilen ama ustalaştığınızda size süper güçler veren bir araçtır. Bu projede üç temel ileri seviye teknik kullandık:

1. Adlandırılmış Yakalama Grupları (Named Capture Groups)

Standart regex’lerde () kullanarak gruplar oluştururuz ve bunlara indekslerle (1, 2, 3…) ulaşırız. Ancak karmaşık desenlerde 7. grubun ne olduğunu hatırlamak zordur. (?P<name>...) sözdizimi ile her gruba bir isim verdik.

Bu sayede match.groupdict() metodunu çağırarak tüm eşleşmeleri anında bir Python sözlüğüne dönüştürebiliyoruz. Kodun okunabilirliği artarken, veri işleme süreci çok daha güvenli hale geliyor.

2. Pozitif Bakış (Positive Lookahead)

Bazen bir satırın belirli bir kriteri karşılamasını isteriz ama o kriterin kendisini sonuç olarak yakalamak istemeyiz. İşte burada “lookahead” devreye girer. (?=.*\[database\]) ifadesi, “satırın ilerisinde ‘database’ kelimesi var mı?” diye kontrol eder. Eğer varsa, eşleşme devam eder; yoksa satır anında elenir. Bu, performansı artıran ve filtreleme mantığını sadeleştiren bir tekniktir.

3. Opsiyonel Gruplar ve Çok Satırlı Mod

Her log satırında hata kodu bulunmayabilir. Bazı satırlar sadece bilgilendirme (INFO) amaçlıdır. (?:...)? yapısını kullanarak hata kodlarını “isteğe bağlı” hale getirdik. Ayrıca re.MULTILINE bayrağı ile, devasa bir metin bloğunun her satırını tek tek, sanki ayrı dosyalarmış gibi tarama yeteneği kazandırdık.

import re
import json

def parse_system_logs(raw_log_data: str) -> list[dict]:
    # Adlandırılmış gruplar ile yapısal analiz
    log_pattern = re.compile(
        r"^\[(?P<timestamp>[\d-]+ [\d:,]+)\]\s+"            # Zaman damgası
        r"\[(?P<level>INFO|WARNING|ERROR|CRITICAL)\]\s+"     # Log seviyesi
        r"\[(?P<component>[\w\.-]+)\]\s+"                    # Bileşen
        r"\((?P<ip_address>\d{1,3}(?:\.\d{1,3}){3})\)\s+-\s+" # IP Adresi
        r"(?P<message>.+?)"                                  # Mesaj içeriği
        r"(?:\s+\[code:(?P<status_code>\d+)\])?$",           # Opsiyonel Hata Kodu
        re.MULTILINE
    )

    parsed_records = []
    for match in log_pattern.finditer(raw_log_data):
        record_data = match.groupdict()
        # Opsiyonel alanları temizle
        record_data["status_code"] = int(record_data["status_code"]) if record_data.get("status_code") else None
        parsed_records.append(record_data)

    return parsed_records

# Örnek kullanım:
log_dump = "[2026-05-22 08:30:15,123] [ERROR] [auth.service] (192.168.1.50) - Invalid credentials [code:401]"
print(json.dumps(parse_system_logs(log_dump), indent=2))

Nasıl Çalıştırılır?

Bu proje herhangi bir dış kütüphane gerektirmez, tamamen Python’ın standart kütüphanesiyle (re ve json) çalışır.

  1. Ortam: Python 3.12+ ve Ubuntu 24.04 (veya herhangi bir Linux/Unix dağıtımı) önerilir.
  2. Çalıştırma:python main.py
  3. Doğrulama: Program çalıştığında, mock log verilerinin nasıl yapılandırılmış JSON formatına dönüştüğünü ve lookahead filtrelerinin nasıl çalıştığını terminalde göreceksiniz.

Ne Öğrendik?

Bu proje ile regex’in sadece basit metin aramaları için değil, gerçek bir veri işleme hattı (data pipeline) kurmak için nasıl kullanılacağını gördük:

  • Performans: re.compile kullanarak desenleri önceden derlemenin hız avantajını.
  • Yönetilebilirlik: Adlandırılmış gruplar ile indeks karmaşasından kurtulmayı.
  • Esneklik: Opsiyonel gruplarla değişken veri yapılarını yönetmeyi.
  • Hassas Filtreleme: Lookahead (bakış) teknikleriyle tüketmeden kontrol etmeyi.

Kaynaklar ve Sonraki Adımlar

Düzenli ifadeler dünyası uçsuzdur. Bir sonraki adım olarak “Negatif Bakış (Negative Lookahead)” veya “Geriye Dönük Bakış (Lookbehind)” tekniklerini araştırmanızı öneririm.

Bu projeyi ve benzeri pratik örnekleri GitHub üzerinde inceleyebilirsiniz:
Practical Python Examples

Ahmet Aksoy

Not: Bu yazıda incelediğimiz kodu ve benzer projelerin kaynak kodlarını https://github.com/ahmetax/practical-python-examples adresinde bulabilirsiniz.

regex, düzenli ifadeler, log ayrıştırma, veri temizleme, ileri python, orta seviye, python programlama, yazılım, kod, ubuntu, linux

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir