Yazılım geliştirmede, geliştirdikten sonra bilgi almada ve sorun olduğunda çözmede en önemli yardımcılardan biri, kuşkusuz loglar oluyor. Uygulamanın loglarının takibi, geleneksel sistemlerde log dosyasını izleyerek yapılmakla birlikte container sistemlerinin yaygınlaşması, bu konudaki alternatif yöntemlerden bir tanesini güçlendiriyor. Container’lar genellikle loglarını stdout ve stderr kanallarına, yani genelde çalıştıran kişinin ekranına yazmaya başlıyor. Dolayısıyla yazılım içerisine konulan her print satırı artık log muamelesi görmeye başlıyor. Bu yazıda, bu loglara Docker üzerinden nasıl ulaşacağımıza bakacağız.

Loglar Nereye Gönderiliyor?

Docker, varsayılan durumda logları kendisi alıyor. Girişte de bahsettiğimiz gibi, loglar artık bizim için ekrana basılan her şey anlamına geliyor. Eğer bir log driver kullanıyorsanız, kendisini logları ekrana basacak şekilde ayarlayabilirsiniz. Bu durumda Docker, bu logları kendisi alıp bir dosyaya yazmaktan sorumlu olacaktır. Ayrıca Docker’ı bu logları GELF formatında bir sunucuya göndermesi, JSON dosyasına kaydetmesi, Journald kullanması, Splunk’a göndermesi v.b. için farklı şekillerde ayarlayarak log toplama ve gönderme kısmını büyük oranda ona bırakabiliriz. Eğer bir ayarlama yapmazsak Docker, normalde logları JSON formatında dosyalar olarak kaydeder. Ancak biz bu log dosyalarına elle ulaşmayı genelde tercih etmeyiz.

Docker’da Loglara Nasıl Ulaşılır?

Logların nasıl kaydedildiğine ve alternatif loglama yöntemlerinin bazılarına değindikten sonra, Docker üzerinden loglara nasıl erişeceğimize bakalım. Docker bize bu iş için logs alt komutunu sağlıyor. Şimdi örnek bir container olarak, bu uygulamayı anlaşılabilir kılması için Nginx container’ı oluşturalım:

docker run -d -p 80:80 --name web nginx

Container’ı oluştururken -d ile arkaplanda çalıştırdık. Yanında yer alan -p parametresinde ise container’ın 80 portunu sunucu/bilgisayar üzerinde 80 portu olarak dışarıya açmak istediğimizi söyledik. Bu durumda, container’a erişmek için eğer bilgisayarınızda çalışıyorsanız tarayıcınıza localhost yazabilirsiniz. Sunucu üzerindeyseniz sunucunun IP adresine tarayıcınızdan girmeniz yeterli olacaktır. Alternatif olarak da, bir terminal açarak:

curl http://localhost

yazarak Nginx’in karşılama sayfasına ulaşabilirsiniz.

Sayfayı açmamız, aslında bir log oluşmasına sebep oluyor. Peki biz Nginx’in bu kayıtlarına nereden erişebiliriz? Bu konuda logları Docker’a sorabiliriz:

docker container logs web

Bazı örneklerde/kaynaklarda, bu komutun eski ve daha kısa haline de ulaşabilirsiniz. Aynı çıktıyı alacak olsak da, aşinalık kazanmak için bunu da belirtelim:

docker logs web

Logları Canlı Takip Etmek (Tail follow)

Şimdiye kadar logları görmeye başladık ancak anlık olarak takip edemiyoruz. Her seferinde komutu tekrar çalıştırmak, hem zor hem de log sayısı fazlaysa gereksiz yere akan yazılara sebep oluyor. Bu yüzden, logları canlı takip edeceğimiz bir sistem işimizi oldukça kolaylaştıracaktır. Bu iş için, tail komutunda olan -f parametresinin aynısı Docker’da da var:

docker container logs -f web

Şimdi tarayıcıdan sayfayı yenilemek veya başka bir terminal ekranından curl http://localhost komutunu çalıştırmak, yeni logların oluşması için yeterli olacaktır.

</figure>

Logların Sadece Son 20 (n) Satırını Almak

Eğer container uzun bir süredir yaşamını sürdürüyorsa, fazla log üretiyorsa veya yüksek bir trafik alıyorsa, bahsettiğimiz yöntemlerle logun son kısımlarına ulaşmak çok uzun sürecek, ekranda sürekli akan yazılarla sonuçlanacak, ve ayrıca hem network kullanımı hem RAM kullanımı gibi faydası çoğu zaman olmayan sonuçlara yol açacaktır. Böyle durumlarda son kaç satırı istediğimizi Docker’a söyleyebiliriz. Örnek olarak, son 20 satırı alıp yenilerini de izlemeye devam edelim:

docker logs -f --tail 20 web

Artık Docker ile çalışan uygulamaların loglarına, eğer stdout’a yazıyorlarsa rahatlıkla erişebilir, anlık izleyebilir ve sadece son satırlara erişebiliriz.