Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

41 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Nirengi

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.


Ne yapar

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.


Ölçülen performans

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.


Mimari

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

Neden hızlı

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.

Bağımlılıklar

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.


Geliştirme

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 build

Ölçüm aracı

nirengi-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 3

Testler

swift 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.


Doğruluk notu

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.


Lisans

Özel. Tüm hakları saklıdır.

About

Streaming Apache/Nginx log analyzer for SEO and crawl-budget analysis on multi-GB logs. 70+ bot families incl. modern AI crawlers (GPTBot, ClaudeBot, PerplexityBot, Bytespider), reverse-DNS verification, 24 reports, React dashboard. Tested at 16 GB / 50.9M lines.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages