İçeriğe geç

Projeler 2025 yayında

LogMerge

Çok sayıda log dosyasını ve arşivi zaman damgası sırasıyla tek bir akışta birleştiriyor. M1 Max üzerinde diskten saniyede yaklaşık 1 GB okuyor.

Go

Dağıtık bir işin logları bir düzine dosyaya dağılır. Bunların arasında driver ve executor logları, sidecar'lar, rotate edilmiş dosyalar ve onların .gz arşivleri vardır. LogMerge hepsini aynı anda okuyor ve her satırı zaman damgası sırasıyla yazıyor. Her satırın hangi dosyadan geldiği yine belli oluyor, stack trace'ler de onları üreten satırın altında kalıyor. M1 Max üzerinde diskten okurken saniyede yaklaşık 1 GB işleyebiliyor.

Zaman damgaları iç içe geçmiş üç log dosyası, sıralı tek bir akışta birleşiyor

Keşif, ön yükleme, min-heap üzerinde birleştirme, biçimlendirme ve yazma

İşin özü bir min-heap. Heap'te açık her dosya için bir girdi var ve girdiler, o dosyanın sıradaki satırının zaman damgasına göre sıralanıyor. LogMerge en erken dosyayı heap'ten alıyor ve sıradaki satırı heap'te kalan en erken zamandan sonraya düşene kadar o dosyadan okumaya devam ediyor. Sonra dosyayı heap'e geri koyuyor. Birleştirme başlamadan önce her dosya için ayrı bir goroutine ilk zaman damgasını ayrıştırıyor, böylece birleştirme dolu bir heap ile başlıyor.

Arşivler diske çıkarılmadan, oldukları yerde okunuyor. Bir arşivin içindeki dosyaya arsiv.tar.gz!/ad.log biçiminde ulaşılabiliyor. ISO 8601, ctime ya da tarih-saat-milisaniye gibi farklı biçimlerdeki zaman damgaları çıktıda hep aynı genişlikte yazılıyor. Satır başına hiç bellek ayrılmıyor.

Go ile yazıldı ve çalışma zamanında hiçbir bağımlılığı yok. Linux, macOS ve Windows için amd64 ve arm64 binary'leri yayımlanıyor. Bunlar profil güdümlü optimizasyonla (PGO) derleniyor.