Docker kapsayıcı günlükleri tek bir dosyaya nasıl yeniden yönlendirilir?


111

Docker konteynerimin tüm günlüklerini analiz etmek için tek bir günlük dosyasına yeniden yönlendirmek istiyorum. denedim

docker logs container > /tmp/stdout.log 2>/tmp/stderr.log

ancak bu iki farklı dosyada log verir. Zaten denedim

docker logs container > /tmp/stdout.log

Ama çalışmadı.

Yanıtlar:


137

Günlükleri yeniden yönlendirmeye gerek yok.

Docker varsayılan olarak günlükleri bir günlük dosyasına depolar. Günlük dosyası yolunu kontrol etmek için çalıştır komutu:

docker inspect --format='{{.LogPath}}' containername

/var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.log

Bu günlük dosyasını açın ve analiz edin.

günlükleri yeniden yönlendirirseniz, yalnızca yeniden yönlendirmeden önce günlükleri alırsınız. canlı günlükleri göremezsiniz.

DÜZENLE:

Canlı günlükleri görmek için aşağıdaki komutu çalıştırabilirsiniz

tail -f `docker inspect --format='{{.LogPath}}' containername`

Not:

Bu günlük dosyası /var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.log, yalnızca docker günlükleri oluşturuyorsa oluşturulur ve günlük yoksa bu dosya orada olmaz. bir zamanki gibi benzer docker logs containernameve komut çalıştırırsak hiçbir şey döndürmez. Bu senaryoda bu dosya kullanılamayacak.


tail -f `docker inspect --format='{{.LogPath}}' myapp`- bu gerçekten JSON
Adam

o dosya orada değilse başarısız olur. docker herhangi bir günlük oluşturmazsa bu dosya oluşturulmayacaktır demektir. ancak docker günlükler oluşturuyorsa, bu komut canlı günlükleri görmek için iyidir. teşekkürler Adam. başkalarına yardım etmek için cevabıma ekledim.
pl_rock

"Docker varsayılan olarak günlükleri tek bir günlük dosyasına depolar." - hangi bağlamda? Docker ana bilgisayarında çalışan tüm kapsayıcılar tek bir dosyaya çıktı mı alıyor? Tek bir kap mı?
Chris Stryczynski

@ChrisStryczynski Docker, konteyner başına bir günlük dosyası oluşturuyor
Eddy Hernandez

127

Bu seçeneğe ne dersiniz:

docker logs containername >& logs/myFile.log

Soruda istenen günlükleri yeniden yönlendirmez, ancak bir kez belirli bir dosyaya kopyalar.


Yanılmıyorsam, bu komut temelde tüm günlükleri kapsayıcı sunmaya başladığında myFile.logs'a kopyalayacaktır. Sağ.?
S Andrew

@SAndrew temelde evet! ancak Docker'ın yeni sürümleri değişebilir. docker logs --helpemin olmak için daha iyi
Eddy Hernandez

39

docker logs -f <yourContainer> &> your.log &

Açıklama:

  • -f(yani --follow): mevcut tüm günlükleri yazar ve sonraki her şeyi günlüğe kaydetmeye devam eder ( izler ).
  • &> hem standart çıktıyı hem de standart hatayı yeniden yönlendirir.
  • Muhtemelen bu yöntemi arka planda çalıştırmak istiyorsunuz, dolayısıyla &.
  • Çıktı ve stderr'i şu şekilde ayırabilirsiniz: > output.log 2> error.log(kullanmak yerine &>).

9

Docker konteynerinizden tek bir günlük dosyasına hem stdout hem de stderr yakalamak için aşağıdakileri çalıştırın:

docker logs container > container.log 2>&1

8

Birden fazla taşıyıcınız olduğunu ve günlükleri tek bir dosyada toplamak istediğinizi varsayarsak fluentd gibi bazı günlük toplayıcılar kullanmanız gerekir. fluentd, docker kapsayıcıları için günlük sürücüsü olarak desteklenir.

Docker-compose'da günlük kaydı sürücüsünü tanımlamanız gerekir.

  service1:
    image: webapp:0.0.1
    logging:
      driver: "fluentd"
      options:
        tag: service1 

  service2:
        image: myapp:0.0.1
        logging:
          driver: "fluentd"
          options:
            tag: service2

İkinci adım, fluentd conf'i hem hizmet 1 hem de hizmet 2 için günlükleri karşılayacak şekilde güncellemektir.

 <match service1>
   @type copy
   <store>
    @type file
    path /fluentd/log/service/service.*.log
    time_slice_format %Y%m%d
    time_slice_wait 10m
    time_format %Y%m%dT%H%M%S%z
  </store>
 </match> 
 <match service2>
    @type copy
   <store>
    @type file
    path /fluentd/log/service/service.*.log
    time_slice_format %Y%m%d
    time_slice_wait 10m
    time_format %Y%m%dT%H%M%S%
  </store>
 </match> 

Bu yapılandırmada, günlüklerin bu yola tek bir dosyaya yazılmasını istiyoruz
/fluentd/log/service/service.*.log

ve üçüncü adım, günlükleri dosyaya yazmaya başlayacak özelleştirilmiş fluentd'yi çalıştırmak olacaktır.

İşte adım adım talimatların bağlantısı

Bit Uzun, ancak günlük dosyaları yolu vb. Üzerinde daha fazla kontrol sahibi olduğunuz için doğru yoldur ve Docker Swarm'da da iyi çalışır.


1

Docker bizim için stdout ve stderr'i birleştirdiğinden, günlük çıktısını diğer kabuk akışları gibi ele alabiliriz. Mevcut günlükleri bir dosyaya yeniden yönlendirmek için bir yeniden yönlendirme operatörü kullanın

$ docker logs test_container > output.log
docker logs -f test_container > output.log

Çıktıyı stderr ve stdout'a göndermek yerine, uygulamanızın çıktısını bir dosyaya yeniden yönlendirin ve dosyayı konteynerin dışındaki kalıcı depolamaya eşleyin.

$ docker logs test_container> /tmp/output.log

Docker, komut satırında göreceli yolları kabul etmeyecektir, bu nedenle farklı bir dizin kullanmak istiyorsanız, tam yolu kullanmanız gerekir.


1

Windows üzerinde çalışan ve (benim gibi) PowerShell kullanıyorsanız, yakalamak için aşağıdaki satırı kullanabilirsiniz stdoutve stderr:

 docker logs <containerId> | Out-File 'C:/dev/mylog.txt'

Umarım birine yardımcı olur!


1
Kapsayıcı adına göre tüm kapsayıcı günlüklerini dosyaya kaydetmek için ...foreach ($element in $(docker ps -a --format "{{.Names}}")) {docker logs $element | Out-File "C:/dockerlogs/$element.log"}
xisket

1

Kullandığım en kolay yol, terminaldeki şu komuttur:

docker logs elk > /home/Desktop/output.log

yapı:

docker logs <Container Name> > path/filename.log

1

Önce kapsayıcı kimliğinizi kontrol edin

docker ps -a

CONTAINER ID sütunlarında ilk satırı görebilirsiniz. Muhtemelen bu "3fd0bfce2806" gibi görünür ve ardından kabuğa yazın

docker inspect --format='{{.LogPath}}' 3fd0bfce2806

Bunun gibi bir şey göreceksin

/var/lib/docker/containers/3fd0bfce2806b3f20c2f5aeea2b70e8a7cff791a9be80f43cdf045c83373b1f1/3fd0bfce2806b3f20c2f5aeea2b70e8a7cff791a9be80f43cdf045c83373b1f1-json.log

o zaman bunu görebilirsin

cat /var/lib/docker/containers/3fd0bfce2806b3f20c2f5aeea2b70e8a7cff791a9be80f43cdf045c83373b1f1/3fd0bfce2806b3f20c2f5aeea2b70e8a7cff791a9be80f43cdf045c83373b1f1-json.log

JSON biçiminde olacaktır, hataları izlemek için zaman damgasını kullanabilirsiniz


0

Tüm kapsayıcı günlüklerini belirli bir dizine kopyalamak için Bash betiği:

#!/usr/bin/env bash

TARGET_DIR=~/logs/docker_logs
mkdir -p "$TARGET_DIR"
for name in `sudo docker ps --format '{{.Names}}'`;
do
    path=$(sudo docker inspect --format='{{.LogPath}}' $name)
    sudo cp -rf "$path" "$TARGET_DIR"/$name.log
done
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.