Bagaimana cara mengarahkan log kontainer buruh pelabuhan ke satu file?

111

Saya ingin mengarahkan semua log container buruh pelabuhan saya ke file log tunggal untuk menganalisisnya. Saya mencoba

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

tetapi ini memberikan log di dua file yang berbeda. Saya sudah mencoba

docker logs container > /tmp/stdout.log

tapi tidak berhasil.

KETAN PATIL
sumber

Jawaban:

137

Tidak perlu mengalihkan log.

Docker secara default menyimpan log ke satu file log. Untuk memeriksa jalur file log, jalankan perintah:

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

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

Buka file log itu dan analisis.

jika Anda mengarahkan log maka Anda hanya akan mendapatkan log sebelum pengalihan. Anda tidak akan dapat melihat log langsung.

EDIT:

Untuk melihat log langsung, Anda dapat menjalankan perintah di bawah ini

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

catatan:

File log ini /var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.logakan dibuat hanya jika buruh pelabuhan menghasilkan log jika tidak ada log maka file ini tidak akan ada. Ini mirip seperti saat kita menjalankan perintah docker logs containernamedan tidak mengembalikan apa-apa. Dalam skenario itu, file ini tidak akan tersedia.

pl_rock
sumber
tail -f `docker inspect --format='{{.LogPath}}' myapp`- Ini benar-benar JSON
Adam
itu akan gagal jika file itu tidak ada. artinya jika buruh pelabuhan tidak menghasilkan log apapun maka file ini tidak akan dibuat. tetapi jika buruh pelabuhan menghasilkan log maka perintah ini bagus untuk melihat log langsung. terima kasih Adam. menambahkannya ke jawaban saya untuk membantu orang lain.
pl_rock
"Docker secara default menyimpan log ke satu file log." - dalam konteks apa? Semua kontainer yang berjalan pada host buruh pelabuhan mendapatkan output ke satu file? Satu wadah?
Chris Stryczynski
@ChrisStryczynski Docker membuat file log per kontainer
Eddy Hernandez
127

Bagaimana dengan opsi ini:

docker logs containername >& logs/myFile.log

Ini tidak akan mengalihkan log yang diminta dalam pertanyaan, tetapi menyalinnya sekali ke file tertentu.

Eddy Hernandez
sumber
Jika saya tidak salah, perintah ini pada dasarnya akan menyalin semua log dari saat penampung mulai disajikan ke myFile.logs. Baik.?
S Andrew
@Andrew pada dasarnya ya! tetapi versi baru Docker dapat berubah. lebih baik untuk docker logs --helpmemastikannya
Eddy Hernandez
39

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

Penjelasan:

  • -f(yaitu --follow): menulis semua log yang ada dan melanjutkan ( mengikuti ) mencatat semua yang muncul berikutnya.
  • &> mengarahkan ulang keluaran standar dan kesalahan standar.
  • Kemungkinan besar Anda ingin menjalankan metode itu di latar belakang, sehingga file & .
  • Anda dapat memisahkan output dan stderr dengan: > output.log 2> error.log(daripada menggunakan &>).
juanmirocks
sumber
9

Untuk menangkap baik stdout & stderr dari kontainer buruh pelabuhan Anda ke satu file log, jalankan perintah berikut:

docker logs container > container.log 2>&1
Jean Velloen
sumber
8

Dengan asumsi Anda memiliki banyak penampung dan Anda ingin menggabungkan log menjadi satu file, Anda perlu menggunakan beberapa agregator log seperti fluentd. fluentd didukung sebagai driver logging untuk kontainer buruh pelabuhan.

Jadi di docker-compose, Anda perlu menentukan driver logging

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

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

Langkah kedua adalah memperbarui konfigurasi fluentd untuk memenuhi log untuk layanan 1 dan layanan 2

 <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> 

Dalam konfigurasi ini, kami meminta log untuk ditulis ke satu file ke jalur ini
/fluentd/log/service/service.*.log

dan langkah ketiga adalah menjalankan fluentd yang disesuaikan yang akan mulai menulis log ke file.

Ini dia tautan untuk petunjuk langkah demi langkah

Bit Long, tapi cara yang benar karena Anda mendapatkan lebih banyak kendali atas jalur file log dll dan itu bekerja dengan baik di Docker Swarm juga.

Abhishek Galoda
sumber
1

Karena Docker menggabungkan stdout dan stderr untuk kita, kita dapat memperlakukan keluaran log seperti aliran shell lainnya. Untuk mengarahkan log saat ini ke file, gunakan operator redirection

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

Alih-alih mengirim keluaran ke stderr dan stdout, alihkan keluaran aplikasi Anda ke sebuah file dan petakan file tersebut ke penyimpanan permanen di luar penampung.

$ docker logs test_container> /tmp/output.log

Docker tidak akan menerima jalur relatif pada baris perintah, jadi jika Anda ingin menggunakan direktori yang berbeda, Anda harus menggunakan jalur lengkap.

Anish Varghese
sumber
1

Jika Anda bekerja di Windows dan menggunakan PowerShell (seperti saya), Anda dapat menggunakan baris berikut untuk menangkap stdoutdan stderr:

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

Saya harap ini membantu seseorang!

mirind4
sumber
1
Untuk menyimpan semua log kontainer ke file, berdasarkan pada nama kontainer ...foreach ($element in $(docker ps -a --format "{{.Names}}")) {docker logs $element | Out-File "C:/dockerlogs/$element.log"}
xisket
1

Cara termudah yang saya gunakan adalah perintah ini di terminal:

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

strukturnya adalah:

docker logs <Container Name> > path/filename.log
itssaifurrehman
sumber
1

Pertama periksa id penampung Anda

docker ps -a

Anda dapat melihat baris pertama di kolom ID PENAMPUNG. Mungkin terlihat seperti ini "3fd0bfce2806" lalu ketik di shell

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

Anda akan melihat sesuatu seperti ini

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

maka Anda dapat melihatnya sebagai

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

Ini akan dalam format JSON, Anda dapat menggunakan stempel waktu untuk melacak kesalahan

kiran beethoju
sumber
0

Skrip Bash untuk menyalin semua log kontainer ke direktori tertentu:

#!/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
Mugen
sumber