Sunucu erişim loglarını okuyup arama motoru botlarının siteyi nasıl taradığını çıkaran, macOS için yazılmış yerel bir SEO log analiz aracı.
Desteklenen biçimler — dosya başına otomatik algılanır, rotasyonlu setler (access.log, access.log.1, …) tek analizde birleşir:
- Apache/Nginx combined ailesi: standart combined, referer/UA'sız Common Log Format,
%v:%pönekli vhost_combined, kuyruk alanlı özel formatlar (Traefik metin çıktısı dahil), syslog (RFC 3164) önekli satırlar, Plesk%v@@%p@@öneki - W3C ailesi: IIS genişletilmiş biçimi ve AWS CloudFront standart logları (
#Fields:başlığından şema; sekme ayraç ve yüzde kodlaması otomatik) - JSON-lines (NDJSON): nginx
escape=json, Caddy, Traefik JSON ve Cloudflare Logpush (üç zaman kodlamasıyla) — bağımlılıksız bayt-seviyesi alan tarayıcıyla, satır başına JSON ağacı kurulmaz - AWS ALB erişim logları (mutlak URL'ler yol+sorguya soyulur, IPv6 istemciler desteklenir)
Nirengi, haritacılıkta bilinen noktalardan konum sabitleme yöntemidir. Araç da aynısını yapar: dağınık milyonlarca log satırından sitenin gerçek tarama durumunu sabitler.
Gigabaytlarca erişim logunu tarayıp 29 rapor üretir:
- Bot davranışı — hangi bot neyi, ne sıklıkta tarıyor; AI tarayıcıları (GPTBot, ClaudeBot, PerplexityBot, Bytespider) dahil ~85 bot ailesi
- Sahte bot tespiti — ters + ileri DNS doğrulamasıyla kendini Googlebot ilan eden trafiği ayıklar
- Tarama bütçesi — varlık dosyaları mı HTML mi taranıyor, bant genişliğini ne yiyor
- Hata yüzeyi — 404, soft-404 adayları, 3xx yönlendirmeler, 5xx
- Kapsam — sitemap'te olup taranmayanlar, robots.txt ihlalleri, kategori bazlı tarama dağılımı
- Yük — IP başına saniyelik/dakikalık tepe istek hızı, saatlik anomaliler
Analiz tamamen cihazda çalışır. Log dosyası hiçbir yere yüklenmez.
Gerçek üretim logu üzerinde, Apple M4 / 16 GB:
| Girdi | 15,4 GB · 50.895.846 satır |
| Süre | 40 saniye |
| Hız | 1.256.178 satır/sn |
| Tepe bellek | 3,6 GiB |
| Benzersiz URL / IP | 3.472.974 / 1.522.184 |
Karşılaştırma için: aynı iş, aynı makinede, önceki Python sürümünde 22 dakika sürüyor ve 4,4 GB kullanıyordu. İlk Swift sürümü 85 saniyeydi; iki iyileştirme dalgası (memchr/memcmp, kelime adımlı hash, birleştirme kopyalarının kaldırılması; ardından release'te exclusivity denetiminin kapatılması, hız analizöründe son-anahtar önbelleği ve pread tabanlı tahsissiz okuma) toplam 2,1 kat hızlandırdı. Ardışık koşularda ±2-3 sn termal varyans normaldir.
RAM'e sığmayacak dosyalar için motor, URL verisini 256 bölmeli run dosyalarına taşıyan disk'e taşan toplama (spill-to-disk) hattına kendiliğinden geçer: sonuçlar RAM yoluyla bit-bit aynıdır (aynı 15,4 GB girdide iki yolun tüm rapor ve özet sayıları birebir doğrulandı), tepe bellek dosya boyutundan bağımsızlaşır; bedeli ~2× süredir. Eşik: birikim tahmini (dosya/5) fiziksel belleğin yarısını aşarsa spill.
macos/
NirengiCore/ Swift paketi — saf mantık, arayüzden bağımsız
Symbols/ Sembol interning: değerler → yoğun Int32 kimlikler
Parsing/ Bayt seviyesi log ayrıştırma
Analysis/ Analizörler
Bots/ Bot tanımları + DNS doğrulama
Network/ robots.txt, sitemap, gzip
Reporting/ Rapor tanımları ve tabloları
App/ SwiftUI arayüz
Sıcak yolda hiç String oluşmuyor. URL, IP, referer ve user-agent değerleri tek bir bitişik bayt tamponunda saklanıp yoğun Int32 kimliklerle temsil ediliyor; sayaçlar sözlük yerine düz dizi. Dosya parçalara bölünüp paralel okunuyor, her işçi kendi sembol uzayını kurup sonda kimlik yeniden eşlemesiyle birleşiyor.
Rapor tabloları da kimlik tabanlı: metin yalnızca ekranda görünen satırlar için çözülür.
Yok. Yalnızca Foundation ve SwiftUI. Üçüncü parti paket kullanılmıyor — App Store incelemesinde ve uzun vadeli bakımda en az sürtünme için bilinçli bir tercih.
Gereksinimler: macOS 14.4+, Xcode 16+, xcodegen.
# Çekirdek testleri
cd macos/NirengiCore
swift test
# Uygulamayı derle
cd macos/App
xcodegen generate
xcodebuild -scheme Nirengi -configuration Debug buildnirengi-cli geliştirme sırasında performans ölçmek içindir, uygulamaya dahil edilmez:
swift build -c release
./.build/release/nirengi-cli <log-dosyasi> --concurrency 3swift test 38 test koşar. İkisi özellikle önemli:
- Paralel–sıralı denklik — aynı log 1 işçi ve 8 işçiyle analiz edildiğinde tüm raporların satır içeriği birebir aynı olmalı. Paralelleştirmenin sonucu etkilemediğini garanti eder.
- Rapor anlık görüntüleri — deterministik sentetik log üzerinde rapor başına FNV-1a özeti. Rapor üretim kodu değiştiğinde çıktının sessizce kaymasını yakalar.
Bir rapor kasıtlı olarak değiştiğinde beklenen özetler şöyle yenilenir:
SNAPSHOT_BLESS=1 swift test --filter ReportSnapshotTestsÇıktıdaki sözlük ReportSnapshotTests.swift içine işlenir. Bu adım bilinçli olmalı — testin amacı istenmeyen değişikliği yakalamaktır.
Analiz mantığı, önceki Python uygulamasına karşı 500.000 satırlık gerçek log örneğinde doğrulandı: 14 rapor bayt bayt aynı çıktı. Kalan 7 farkın tamamı incelendi ve açıklandı — ikisi Python tarafındaki hataların kasıtlı düzeltmesi (4xx_diger artık 400/405 gibi kodları da içeriyor), üçü eşit değerlerin kesim noktasındaki sıralaması (Swift deterministik, Python sözlük ekleme sırasına bağlıydı), ikisi 0,01'lik yuvarlama farkı.
Bu doğrulama tamamlandıktan sonra Python altyapısı kaldırıldı. Bugünkü davranışı koruyan şey snapshot testleridir.
Özel. Tüm hakları saklıdır.