Docker Logs

Docker logs, bir container’ın ürettiği logları görüntülemek için kullanılan Docker komutudur. Docker’ın temel log yaklaşımı şudur. Container içindeki uygulama loglarını dosyaya değil, stdout ve stderr’e yazmalıdır. Docker da bu çıktıları yakalar ve docker logs komutu ile bize sunar.

docker üzerinde tüm işlemler driver üstünden yürür. docker logs'ta diğerleri gibi log driver ile çalışır. Varsayılan olarak json-file kullanılmaktadır. Ancak istenirse, syslog, journald, fluentd, awslogs, loki gibi çözümlerde kullanılabilir. Ama hepsinin çalışması stdout + stderr üzerinden yürümektedir.

Docker Logs Ne İşe Yarar?

Docker logs ile uygulamanın çalıştığını, hataları, API, Servis neden cevap vermiyor gibi durumları anlayabilirsiniz. Ek olarak, Container içine girmeden log okuyabilirsiniz.

stdin, stdout, stderr Nedir?

Bu kavramlar Docker’a özel değildir, Linux / Unix sürecinin temelidir.

Uygulamanın girdi aldığı kanal Klavye, pipe veya başka bir süreç olabilir. Yani ls komutuna basarsanız bu stdin olarak kabul edilir. Burada önemli olan kısım, docker logs stdin’i izlemez. Çünkü stdin bir giriş, log üretmez.

Uygulamanın normal çıktıları, bilgi mesajları, access ve başarı mesajlarını bize verir. Örnek: Server started on port 80 GET /index.html 200 

Uygulamanın Hata, uyarı ve kritik mesajlarını bize verir. Program düzgün çalışsa bile stderr kullanılabilir. Örnek: [error] connect() failed (111: Connection refused)

docker logs

Genel özet sonrası nginx uygulamasından örnekleme yapalım. Bunun için öncelikle bir nginx uygulaması ayağa kaldıralım.

docker run -d --name test3 -p 88:80 nginx

Logları anlık olarak görmek için aşağıdaki komutu kullanalım.

docker logs -f test3 
  • Son 50 satırı görmek için docker logs --tail 50 test3 komutunu kullanabilirsiniz.
  • Zaman damgası ile görmek için docker logs -t test3 komutunu kullanabilirsiniz.

Şimdi bunun mantığını anlamaya çalışalım.  Nginx normalde erişim loglarını /var/log/nginx/access.log dosyasına yazarken, hata loglarını ise /var/log/nginx/error.log dosyalarına yazar. Ancak Docker dünyasında bu önerilmez.

Peki Docker’da Nginx Logları Nasıl Çalışır?

Docker resmi Nginx imajında aşağıdaki işlem yapılması gerekir.

  • access.log → stdout
  • error.log → stderr

Bunu daha iyi anlamak için container içine girelim.

docker exec -it test3 bash

Container içindeyken log dosyalarını incelediğimiz zaman logların yönlendirildiğini görebiliriz.

Aklınıza kendi container’ımın loglarını nasıl yönlendiririm sorusu gelmiştir. En doğru yol Logları stdout / stderr’e yazmak olacaktır. Yukarıdaki gibi nginxte Linux seviyesinde symbolic link (symlink) kullanabilirsiniz.

Bu sayede uygulama dosyaya yazdığını zanneder, ama o dosya stdout / stderr’e linklidir. Container içine girip linkleme işlemini basit bir şekilde yaparsınız. Bu sayede uygulama log dosyalarına yazdıkça, docker logs dolmaya başlar.

ln -s /dev/stdout /var/log/myapp/access.log
ln -s /dev/stderr /var/log/myapp/error.log

Ancak en doğru ve kalıcı yöntem imaj dosyasını hazırlarken bu işlemi yapmanız gerekir. Aşağıda dockerfile örneği mevcuttur.

FROM alpine

RUN mkdir -p /var/log/myapp \
 && ln -sf /dev/stdout /var/log/myapp/access.log \
 && ln -sf /dev/stderr /var/log/myapp/error.log

COPY app /app
CMD ["/app"]

Bunlara ek olarak anlaşılması adına basit bir script uygulamasını imaj haline getirip çalıştırarak testler yapabilirsiniz.

#!/bin/sh
echo "INFO: Uygulama başladı"
echo "ERROR: DB bağlantısı yok" >&2
sleep 1000
  • echo → stdout
  • >&2 → stderr

Docker bunu otomatik yakalar. Herhangi bir işlem yapmanıza gerek yoktur. 

Sonra bu scripti docker file ile hazırlayabilirsiniz.

FROM alpine
COPY app.sh /app.sh
RUN chmod +x /app.sh
CMD ["/app.sh"]

Artık tek yapmanız gereken docker build kullanıp oluşan imajı çalıştırmak. Bu şekilde docker logs komutunu kullanarak testleri gerçekleştirebilirsiniz.

Blog'a Dön