Docker'da birden çok günlük akışı nasıl bulunur?


21

Üç günlük türünü üç ayrı dosyaya yazan bir uygulamamız var: erişim günlükleri, genel uygulama günlükleri ve sistem günlükleri. Bu günlüklerin biçimi (ve amacı) çok farklıdır. Ve bunları merkezi sistemimize ayrı ayrı gönderen ayrı logforwarderlerimiz var.

Olay günlükleri ilkesi olarak tedavi günlüklerine dayanarak, dosyaları kullanmaktan stdout'a geçmeyi düşünüyoruz. Bu yaklaşımın faydalarından bazılarını bilsek de, bu, aynı zamanda merkezi sistemimize (Kibana / Splunk) göndermeden önce ikiye bölmemiz gereken farklı biçimlendirilmiş günlüklerin birleştirilmiş bir akışını alacağımız anlamına da gelir. / vb.) veya içinde.

Bu duruma nasıl yaklaşmamız gerektiğine dair herhangi bir araç veya öneri olup olmadığını merak ediyoruz.


4
Buna değer olduğunu sanmıyorum. Neden sadece bir "prensip" nedeniyle günlük akışlarını birleştirmek ve sonra bölmek için daha çok çalışalım? Dosyalar iyidir. Dosyalar çalışır. Bu kulağa daha motorsuz geliyor. Belki tüm etiketleri syslog, farklı etiketler, vb ile boru söyleyebilirim ama ekibimden biri bunu önerdiğini söylemeliyim .. hayal kırıklığına uğradım.
Assaf Lavie

Çünkü dosyaları kullanmak, özellikle bir docker konteyneri içinden üretildiyse, başka tür yönetim kabuslarına sahiptir. Şimdilik stdout'a
geçmenin

3
"Kabuslar" ı bilmiyorum. Bunun bir süredir yapıldığını biliyorum ve orada bunu yapmanıza yardımcı olacak birçok yazılım var. Günlük dosyaları döndürülür, kontrol noktaları ile okunur - bir dosya bunun için harika bir soyutlamadır. Eski, tanıdık kalıpların korkusundan dolayı bana yeni kabuslar satan bir prensip satın almam. Günlük kayıtlarınız bir dosyaya yazılır veya bellekte işlenir (en azından kapta hareket ettirildikleri sürece). Bellek içi akış ayırıcıları ve birleşmeleriyle günlük dosyalarının güvenilirliğini sağlamada iyi şanslar.
Assaf Lavie

@AssafLavie Bunu, yükseltilebilecek bir yanıta yazmalısınız. IMHO tamamen geçerli bir bakış açısı.
Dan Cornilescu

2
Buraya aynı soru ile geldim. Basit gerçek şu ki, docker'ın yerleşik günlükleme işlevselliği, stdout / stderr'a giden her şeye bağlıdır, bu nedenle günlük sürücüsü ve etrafında oluşturulan 3. taraf araçlarının ekosistemi de yapar. Tüm günlüklerimi bir ana bilgisayar birimine de dökmek için cazip geldim, ancak konteynırlarım k8 veya openhift veya gke veya başka bir yere taşındığında geri dönmeye ve yönetmeye devam edeceğimi biliyorum. stdout yaklaşımı çok daha pürüzsüz olacak. Bu arada bu meşru soruya bir cevap aramaya devam edeceğim
Rhubarb

Yanıtlar:


13

Hala kendim birleştirme / bölme yaklaşımı arıyorum, ancak bu arada Kubernetes belgeleri tarafından önerilen bu yaklaşım sağlam bir çözüm gibi görünüyor: Her bir ayrı günlük için bir sepet kullanın .

"Sepet", bir şekilde çalışmak için başka bir docker konteynerinin yanında kullandığınız herhangi bir docker konteyneri. Bu durumda üç günlüğünüzün her biri için günlükleri ve çıkışları stdout'a tarayan veya kuyruklayan ayrı bir kapsayıcı olacaktır.

Bu şekilde, günlük sepet sepetlerinizin her birinin kendi stdout'undan kendi docker günlüğü vardır. Bunun gibi ayrı olmak için, ayırma veya toplama için standart docker (ve kubernetes, vb.) Uygulamalarını kullanabilirsiniz. Kubernetes sayfasının söyledikleri:

Bu yaklaşım, bazı günlük akışlarını uygulamanızın farklı bölümlerinden ayırmanıza olanak tanır; bunlardan bazıları stdout veya stderr'e yazma desteği alamaz. Günlükleri yeniden yönlendirmenin arkasındaki mantık asgari düzeydedir, bu yüzden önemli bir yük değildir. Ayrıca, stdout ve stderr kubelet tarafından işlendiğinden, kubectl günlükleri gibi yerleşik araçları kullanabilirsiniz.

"Ayrı günlük akışları", docker'ın, burada docker belgelerinde açıklanan farklı kaplardaki günlüklere uyguladığı yerleşik etiketlemeden kaynaklanır :

Etiket günlüğü seçeneği, kapsayıcının günlük iletilerini tanımlayan bir etiketin nasıl biçimlendirileceğini belirler. Varsayılan olarak, sistem kapsayıcı kimliğinin ilk 12 karakterini kullanır. Bu davranışı geçersiz kılmak için bir etiket seçeneği belirtin


Bu günlük sepet sepet kaplaması yaklaşımının dezavantajından bahsetmeye değer: "Düşük CPU ve bellek kullanımına rağmen günlükleri bir dosyaya yazmanın ve daha sonra stdout'a aktarmanın disk kullanımını iki katına çıkarabileceğini unutmayın". Acaba bu yaklaşımı pratikte deneyen biri var mı.
yusong

8

Onları daha sonra bölmek için bir akışta birleştirme fikri acı verici geliyor. Bunu kendim yapmak için bir nedenim yoktu, ama burada başlayacağım:

  • Docker kapsayıcısını çalıştırdığınızda, ana bilgisayardan günlükleri görüntülemeyi / göndermeyi kolaylaştıracak bir birim oluşturun.
  • Günlükleri günlük toplayıcınıza göndermek için remote_syslog2 gibi bir şey kullanın

Ana bilgisayarda da bazı kurulum yapmak zorunda kalmak biraz daha zarif hissettirmiyor, ancak bir oyun kitabı çalıştırabileceğiniz ve kutuya konuşlandırmanız sırasında ayarlayabileceğiniz, ansible gibi bir şey kullanıyorsanız, çok da olmamalıdır. kötü.


Bu çözüm adlandırılmış borularla birleştirilebilir, adlandırılmış borularla ilgili tek sorun şu anda tüm sistemlerde çalışmamalarıdır. Mac'te
Jens
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.