Compose: Fitur: Kemampuan untuk menghapus riwayat log

Dibuat pada 9 Mar 2015  ·  145Komentar  ·  Sumber: docker/compose

Sebuah fitur yang menurut saya akan berguna sejak awalnya menggunakan Fig, dan sekarang Compose akan menjadi kemampuan untuk menghapus riwayat log untuk container yang dikelola Composed. Penampung yang berjalan lama atau "cerewet" bisa berakhir dengan banyak kebisingan log yang mungkin tidak diinginkan.

Saya berharap perintah seperti berikut akan menyelesaikan masalah:
$ docker-compose logs --clear [service]

arelogs kinenhancement

Komentar yang paling membantu

docker logs -c (clear) <container> akan bagus.

+1

Semua 145 komentar

Saya tidak berpikir itu adalah fitur yang didukung oleh daemon buruh pelabuhan. Melihat dokumen api, satu-satunya pilihan adalah memotong log yang dikembalikan ke sejumlah baris per penampung:

https://docs.docker.com/reference/api/docker_remote_api_v1.17/#get -container-logs

: +1: untuk masalah ini. Saya sebenarnya menggunakan compose untuk mengembangkan situs web di Golang, Mongodb, dan nginx ... 5 hari setelah memulai, saya memiliki log panjang yang menjadi mengkhawatirkan. Setiap kali saya memulai ulang kontainer menambahkan banyak baris ke log.
@dnephin Saya tidak mengerti jika Anda memberikan solusi (yang saya tidak mengerti :)) atau jika Anda mengusulkan untuk memeriksa apakah itu mungkin dengan api. Maaf atas bahasa Inggris saya yang buruk.

Docker 1.6 akan menambahkan dukungan untuk driver logging, lihat https://github.com/docker/docker/pull/10568 (saat ini; JSON, syslog dan "none") pekerjaan sedang berlangsung untuk rotasi log dasar; https://github.com/docker/docker/pull/11485

Senang mendengarnya, terima kasih banyak :)

Terima kasih atas latar belakang dan pembaruan pada Docker 1.6 - menantikannya!

docker logs -c (clear) <container> akan bagus.

+1

+1 Sangat penting

Astaga, saya hanya duduk melewati beberapa menit batang kayu untuk sampai ke ujung. Saya sangat menghargai ini juga karena tidak harus membangun kembali kontainer secara terus menerus.

+1

+1

+1

: +1:

+1

+2

+1

Sebagai catatan, dengan Docker 1.8 dan docker-compose 1.4 sudah ada metode untuk membatasi ukuran log menggunakan https://docs.docker.com/compose/yml/#log -driver dan log-opt max-size:

  log_driver: "json-file"
  log_opt:
    max-size: "100k"
    max-file: "20"

@dmage Terima kasih, apa yang saya butuhkan.

+1000

+1 akan MENYUKAI ini

+1

Solusi @dmage sangat bagus untuk kami. Orang lain yang memberi ini +1, apa yang salah dengan solusi yang dia berikan?

@ Rodeoclash - Saya pikir salah satu kasus penggunaan untuk ini adalah penggunaan kembali satu set wadah untuk menjalankan baru yaitu uji coba CI. Log lama tidak relevan dengan proses baru, jadi clear sebelum perintah berikutnya akan menghilangkan kebingungan.

+1

+1, kebutuhan yang sama seperti @rosskevin

Oke, untuk merekap:

  • Anda dapat melakukan ini dari file tulis (lihat https://github.com/docker/compose/issues/1083#issuecomment-141936600)
  • # 265 mencakup kemampuan untuk membatasi keluaran dari perintah logs
  • # 1756 mencakup wadah wadah yang digunakan kembali

Akan menutup ini karena sudah mendukung atau dilacak di masalah lain.

Saya tidak begitu mengerti mengapa ini ditutup. Bagaimana Anda menghapus riwayat log?

Saya menambahkan:

  log_opt:
    max-size: 50k

Untuk membatasi panjang log.

Mereka benar-benar perlu menambahkan ini, ini penting. Membatasi log itu bagus dan semuanya tetapi harus ada perintah sederhana untuk menghapus log.

docker logs -c <container>

Apa yang memberi?

Saya mengerti cara membatasi ukuran log, tetapi bagaimana cara Anda _menghapus_ log?

Saya tidak berpikir membersihkan log didukung oleh mesin buruh pelabuhan, yang mengelola log.

Mungkin dengan driver log kustom Anda bisa melakukan itu, tetapi itu akan bersifat eksternal untuk dibuat.

1 karena dapat membersihkan log ...

+1

+1

+1

+1

1 untuk perintah log yang jelas.

1 untuk perintah log yang jelas

+1

+1

+1

: +1:

+1

+1

docker-logs-clean.sh

#!/bin/bash

rm $(docker inspect $1 | grep -G '"LogPath": "*"' | sed -e 's/.*"LogPath": "//g' | sed -e 's/",//g');

Doa:

sudo ./docker-logs-clean.sh <container-name>;

@sgarbesi terima kasih!
+1

1 untuk perintah log yang jelas

Ditutup demi?

Untuk mengulangi komentar saya dari https://github.com/docker/compose/issues/1083#issuecomment -149357280:

Oke, untuk merekap:

  • Anda dapat melakukan ini dari file tulis (lihat https://github.com/docker/compose/issues/1083#issuecomment-141936600)
  • # 265 mencakup kemampuan untuk membatasi keluaran dari perintah logs
  • # 1756 mencakup wadah wadah yang digunakan kembali

Jika yang Anda cari adalah beberapa perintah seperti docker logs --clear , yang tidak didukung oleh mesin buruh pelabuhan, jadi Anda perlu memintanya di buruh pelabuhan / buruh pelabuhan. Namun, menurut saya opsi di atas seharusnya sudah cukup untuk kebanyakan kasus. Apa yang diinginkan kebanyakan orang adalah menampilkan subset log, bukan menghapusnya.

Terima kasih @dnephin , dan semua orang atas kontribusinya. Saya mengangkat masalah ini hampir setahun yang lalu, dan menilai dari komentar sejak saat itu tampaknya cukup jelas bagi saya bahwa manajemen log adalah masalah bagi banyak pengguna penulisan.

Ada beberapa solusi yang disebutkan, saya sendiri kebanyakan menggunakan max-size untuk menyimpan log dengan panjang yang wajar. Ini sangat membantu, dan saya berterima kasih atas penyelesaiannya, tetapi penting untuk diingat bahwa ini adalah _workaround_, bukan solusi.

Juga jelas bagi saya sekarang bahwa bagian dari tanggung jawab untuk memperbaikinya terletak di dalam sistem logging Docker dan perlu menyediakan perintah clear untuk digunakan Compose - cukup adil.

Namun, semua yang dikatakan, ada beberapa fitur yang telah membuatnya menjadi rilis Docker sejak tiket ini dibuat - yaitu --since=<timestamp> dan --tail=<num-lines> yang dapat didukung oleh Compose untuk mendekati memberikan yang nyata solusi untuk masalah ini.

Misalnya, mendukung --since dapat membuat hal seperti ini menjadi mungkin:

$ docker-compose logs --since=now my_container

atau

$ docker-compose logs --since=5m my_container

Dukungan untuk --tail juga akan berguna, mis

$ docker-compose logs --tail=100 my_container

dan tentu saja, kombinasinya. Mungkin juga masuk akal untuk mendukung ini di docker-compose.yml sebagai bagian dari blok logging , tetapi bahkan tanpa itu hanya dengan mendukung dua opsi ini saya curiga Anda dapat memuaskan mayoritas orang yang telah + 1 untuk tiket ini.

Singkatnya, terima kasih sekali lagi untuk semua umpan balik dan solusi, dan untuk Docker dan Compose sendiri - keduanya adalah produk hebat - saya harap Anda akan mempertimbangkan ide yang dikemukakan di utas ini dan terus membuat produk ini lebih hebat lagi.

Lihat # 2227 untuk ringkasannya

: +1: terima kasih @dnephin , saya menantikannya!

Apa yang saya lakukan adalah menghapus secara manual file <container-id>-json.log ditempatkan di dalam /var/lib/docker/containers/<container-id>/ (gunakan sudo ). Setelah saya menjalankan docker-compose logs , log itu kosong. Ini bukan solusi tetapi dengan file .bash Anda dapat mengotomatiskan pembersihan sebelum setiap build.

Sunting: Sesuatu seperti ini berhasil (gunakan dengan resiko Anda sendiri !!):

sudo find /var/lib/docker/containers/ -type f -name '*-json.log' -delete

+1

+1

+1

+1

+2

+2

+1

+20

+1

+1

+1

+1

@sgarbesi Setelah menjalankan perintah bersih itu, fitur log akan berfungsi normal?

+1

docker-logs-clean.sh

#!/bin/bash

for container_id in $(docker ps -a --filter="name=$name" -q);

    do file=$(docker inspect $container_id | grep -G '"LogPath": "*"' | sed -e 's/.*"LogPath": "//g' | sed -e 's/",//g');

    if [ -f $file ]
      then
          rm $file;
    fi

done

Doa:


chmod +x docker-logs-clean.sh

sudo ./docker-logs-clean.sh

1 untuk opsi baris perintah untuk membersihkan log secara manual

@kassanoor Apakah untuk saya.

+1

Terima kasih untuk cara lain untuk membersihkan log kontainer

👍

+1 👍

+1!

+1

+1

+1

Ini akan menjadi fitur yang hebat untuk dimiliki, saya memiliki beberapa kontainer yang berbasis Java dan bahkan setelah satu atau dua hari ketika pemecahan masalah dapat memakan waktu 30 detik atau lebih untuk melakukan docker logs -f <container> karena Java menyukai multi-baris itu log.

Hal lain yang mungkin lebih mudah untuk diterapkan adalah tanda lain pada log untuk memulai ekor tanpa menggemakan semua log yang ada docker logs -f -n <container> misalnya (artinya hanya mengikuti log baru). Ini hanya akan menggemakan pesan log yang diterima setelah menjalankan perintah.

Kebalikannya juga akan bekerja (dan akan lebih dekat dengan cara kerja gnu tail) adalah melakukan -f echos 5-10 baris terakhir dan kemudian baris baru secara default dan menambahkan bendera untuk meng-echo semuanya seperti sekarang (mungkin docker logs -f -a <container> atau sesuatu).

Pada catatan itu saya ingin memiliki fitur dari gnu tail yang memungkinkan spesifikasi berapa banyak baris ke ekor seperti docker logs -100 <container> memberi saya 100 baris terakhir.

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

Apakah ada trik untuk Docker untuk mac? Terima kasih dan +1 untuk opsi baris perintah untuk ini :)

+1

+1

+1

UPDATE: 2016/10/08 - Persyaratan "jq" dihapus karena "log buruh pelabuhan" mendukung template Go! (https://docs.docker.com/engine/admin/formatting/)

Halo semua,

Karena menghapus file yang bisa dibuka biasanya merupakan ide yang BURUK - terutama jika Anda mencoba menghemat ruang disk! - Saya telah memperluas upaya awal @sgarbesi , @lvitals & @wazoo (terima kasih atas idenya, teman-teman) untuk menghasilkan skrip yang sedikit lebih fungsional di bawah ini.

Salin kode di bawah ini ke dalam sebuah file
vi ./docker-container-log-trim.sh
Buat file tersebut dapat dieksekusi
chmod +x ./docker-container-log-trim.sh
Kemudian jalankan dengan
sudo ./docker-container-log-trim.sh

Batalkan komentar baris dengan > saat Anda mempercayai skrip ... di situlah keajaiban terjadi. :-)

Umpan balik diterima.
Terima kasih.

PS. Teruji, tetapi tidak tangguh dalam pertempuran. Gunakan dengan resiko sendiri.

#!/bin/bash

# NOTES:
#  Does NOT delete logfile (BAD IDEA) - simply trims file with redirect.
#  Handles single/all-running/all-existing containers - see end of script for usage.
#  Enjoy :-)


_get_container_logfile() {

  case $1 in

    running) _trim_container_logfile "$(docker ps -q)" $2
             ;;

        all) _trim_container_logfile "$(docker ps -aq)" $2
             ;;

          *) _trim_container_logfile "$(docker ps -a | awk -v ID=$1 '$1 ~ ID || $NF ~ ID {print $1}')" $2
             ;;

  esac

}


_trim_container_logfile() {

  TEMP=$(mktemp)

  case $2 in
    *[!0-9]*) echo "[lines] must be a number - \"$2\" is not a number."
              exit 1
              ;;
        ''|*) MAX=${2:-1000}
              ;;
  esac


  if [ -z $1 ]
  then
    echo "Container name/id unknown!"
    exit 1
  else
    for container in $1
    do
      logfile="$logfile $(docker inspect --format '{{ .LogPath }}' $container)"
      echo "Keeping $MAX lines: $logfile"

      tail -n ${MAX} $logfile > $TEMP
      # Uncomment the next line when you trust the script!
      # cat $TEMP > $logfile
    done
  fi

  rm $TEMP
}


if [ -a "$(which docker)" ]
then
  case $1 in
    --trim) if [ -z $2 ]
            then
              echo "Container name/id missing!"
              exit 1
            else
              _get_container_logfile $2 $3
            fi
            ;;

    --trim-running) _get_container_logfile running $2
                    ;;

    --trim-all) _get_container_logfile all $2
                ;;

    *) echo "Usage:"
       echo "  --trim {container} [lines]   Keep [lines] of logfile for a single container"
       echo "  --trim-running     [lines]   Keep [lines] of logfile for all running containers"
       echo "  --trim-all         [lines]   Keep [lines] of logfile for all containers"
       echo "Default: lines=1000"
       exit 1
       ;;
  esac
else
  echo "Requires \"docker\""
  exit 1
fi

+1

+1

Jadi karena sudah diungkapkan berkali-kali bahwa ada permintaan untuk perintah yang jelas dan eksplisit dan karena tidak pernah ada yang ditambahkan, adakah kemungkinan ini akan dibuka kembali?

Itu tergantung pada perubahan mesin buruh pelabuhan tentu saja, tetapi itu masih sesuatu yang pada akhirnya perlu ditangani dalam penulisan-buruh pelabuhan juga - dan itu pasti tidak diperbaiki sejauh menyangkut perintah eksplisit.

@DavidPesticcio Saya mendapatkan kesalahan ini saat menjalankan skrip Anda: line 53: $logfile: ambiguous redirect (setelah menghapus komentar)

Hai @gingerlime , Sepertinya $ TEMP tidak diisi ... mungkin Anda belum menginstal "mktemp", atau mungkin tidak ada di jalur Anda? : - /

"Bekerja dengan baik untuk saya" - ya saya tahu, itu tidak banyak membantu Anda, tapi itu benar ... :-)

Saya telah memperbarui skrip, jadi Anda tidak perlu "jq" lagi - mungkin saya harus menambahkan bail-out jika mktemp hilang juga ... Saya pikir itu alat standar - tapi mungkin Anda tidak menjalankan script dalam instalasi "standar" - seperti dari dalam wadah minimal mungkin? :-)

Semoga membantu!

Saya memiliki mktemp , dan sering menggunakannya ... Tidak menghabiskan banyak waktu untuk men-debugnya. Berakhir dengan skrip yang lebih sederhana di atas yang hanya menghancurkan log tersebut. Di lingkungan dev kita, mereka tidak penting.

pada pengaturan saya (yaitu berjalan sebagai tanpa pengguna root) skrip bash ini tidak membantu kasus saya mendapat premisi ditolak mencoba membuka file log.

ini agak aneh, bahwa sebagai pengguna saya dapat memulai buruh pelabuhan, tetapi dapat juga mengatakan itu file log ...
lebih dari alasan untuk memiliki sesuatu yang dikeluarkan untuk perintah buruh pelabuhan / buruh pelabuhan-menulis

Saya harus memodifikasi skrip @DavidPesticcio karena kesalahan yang disebutkan sebelumnya ... ini dia:

#!/bin/bash

# NOTES:
#  Does NOT delete logfile (BAD IDEA) - simply trims file with redirect.
#  Handles single/all-running/all-existing containers - see end of script for usage.
#  Enjoy :-)


_get_container_logfile() {

  case $1 in

    running) _trim_container_logfile "$(docker ps -q)" $2
             ;;

        all) _trim_container_logfile "$(docker ps -aq)" $2
             ;;

          *) _trim_container_logfile "$(docker ps -a | awk -v ID=$1 '$1 ~ ID || $NF ~ ID {print $1}')" $2
             ;;

  esac

}


_trim_container_logfile() {

  TEMP=$(mktemp)

  case $2 in
    *[!0-9]*) echo "[lines] must be a number - \"$2\" is not a number."
              exit 1
              ;;
        ''|*) MAX=${2:-1000}
              ;;
  esac


  if [ -z "$1" ]
  then
    echo "Container name/id unknown!"
    exit 1
  else
    for container in $1
    do
      logfile="$(docker inspect --format '{{.LogPath}}' $container)"
      if [ ! -f "$logfile" ]; then continue; fi
      echo "Keeping $MAX lines: $logfile"

      tail -n ${MAX} "$logfile" > "$TEMP"
      # Uncomment the next line when you trust the script!
      # cat "$TEMP" > "$logfile"
    done
  fi

  rm "$TEMP"
}


if [ -a "$(which docker)" ]
then
  case $1 in
    --trim) if [ -z $2 ]
            then
              echo "Container name/id missing!"
              exit 1
            else
              _get_container_logfile $2 $3
            fi
            ;;

    --trim-running) _get_container_logfile running $2
                    ;;

    --trim-all) _get_container_logfile all $2
                ;;

    *) echo "Usage:"
       echo "  --trim {container} [lines]   Keep [lines] of logfile for a single container"
       echo "  --trim-running     [lines]   Keep [lines] of logfile for all running containers"
       echo "  --trim-all         [lines]   Keep [lines] of logfile for all containers"
       echo "Default: lines=1000"
       exit 1
       ;;
  esac
else
  echo "Requires \"docker\""
  exit 1
fi

@dnephin ada kemungkinan ini bisa dibuka kembali, karena ada permintaan yang jelas untuk memiliki perintah jelas satu kali yang eksplisit untuk log?

Potong log untuk penampung tertentu (harus berupa root):

cp /dev/null $(docker inspect -f '{{.LogPath}}' container_name)

Anda menginginkan pemotongan, bukan penghapusan. (Menghapus file yang direferensikan oleh pegangan file yang terbuka tidak akan mendapatkan kembali ruang hingga proses, dalam hal ini, daemon Docker, benar-benar keluar)

@oogali cukup adil. Masih akan menyenangkan memiliki perintah yang tepat untuk melakukannya sesuai permintaan.

+1

akan menyenangkan memiliki perintah yang tepat untuk itu

+1
akan menyenangkan memiliki perintah yang tepat untuk melakukannya sesuai permintaan.

Ini tidak perlu dipikirkan lagi, mengatur tanggal mulai sebagai filter lebih berhasil daripada hanya membersihkannya untuk melihat keluaran saat ini. Silakan tambahkan fitur ini.

+1

+1

+1

+1

+1

Saran terkait tangensial:

Saat melakukan docker-compose logs -f , secara otomatis default ke --tail=30 (atau nomor lain yang masuk akal)

docker-compose logs -f tidak cukup karena dengan banyaknya log yang ditampilkan membutuhkan waktu yang sangat lama

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

Atau ada solusi ini juga

logpath=`docker inspect --format='{{.LogPath}}' reveelium_metricsextraction_1` && mv $logpath $logpath".bckup"

Tolong, berhenti berkomentar +1. Itu membuat utas ini sangat sulit untuk membaca dan mengekstrak informasi berharga. Ada tombol jempol di posting OP untuk ini.

Tidak ada di sini yang berfungsi untuk saya dengan Docker untuk mac. Saya telah meretas sesuatu yang berfungsi berdasarkan membaca utas ini dan forum buruh pelabuhan.

Masalah dengan D4M, adalah bahwa di mac, Anda harus menjalankan perintah di xhyve vm. Jadi, inilah yang saya dapatkan. Tambahkan kedua fungsi ini ke .bash_profile .

Penting : jangan lupa untuk memulai shell baru atau memuat ulang profil Anda sebelum melanjutkan.


Sekarang, docker-logs-clean terlihat seperti ini:

#!/bin/bash -e

if [[ -z $1 ]]; then
    echo "No container specified"
    exit 1
fi

logFile=$(docker inspect -f '{{.LogPath}}' $1 2> /dev/null)

echo -n "Cleaning ${logFile}... "
d4mexec << EOF
> $logFile
EOF
echo "done"

Perhatikan bahwa saya bukan rm ing file log, tetapi hanya melakukan > , yang akan memotong file sepenuhnya.

FWIW di docker-compose versi 2 fitur untuk membatasi ukuran file log:

version: '2'
services:
  my-service:
    image: nginx:alpine
    restart: always
    logging:
      # limit logs retained on host to 25MB
      driver: "json-file"
      options:
        max-size: "500k"
        max-file: "50"

Itu tidak didokumentasikan dengan baik di situs buruh pelabuhan, dan ini mungkin berguna bagi orang lain.

+1

+1

+1

+1

+1

Saya membuat skrip sederhana docker_clear_log.sh :
sudo truncate -s 0 $(docker inspect --format='{{.LogPath}}' $1)
Penggunaan: ./docker_clear_log.sh [Nama-atau-ID]
Seharusnya berfungsi jika Anda memiliki hak sudo dan log_driver: "json-file" pengaturan untuk buruh pelabuhan Anda (default).

+1

Saya juga mencoba solusi temp dan tampaknya berhasil

Masalah asli tidak pernah terselesaikan dan masalah tersebut tetap ditutup. Menarik. @djessup , apa kamu suka apel itu?

akan tetap menyenangkan memiliki log yang dibuat oleh buruh pelabuhan --clean

Mengapa masalah ini telah ditutup bahkan tanpa ada komentar padahal masalah itu sendiri belum terselesaikan?

@linvi

Ketika saya sampai di utas ini, komentar penutup telah dilipat menjadi komentar lain. Ada di sini:

https://github.com/docker/compose/issues/1083#issuecomment -149357280

Saya pikir mereka berharap untuk menutupi kasus penggunaan khusus ini melalui cara tidak langsung. Sebutkan kasus penggunaan khusus Anda dan bagaimana hal itu tidak tercakup, dan itu mungkin membantu tiket dibuka kembali. Kasus terburuk, seseorang mungkin menunjukkan cara mudah untuk mendapatkan apa yang Anda inginkan: D

Ada pembaruan?

ketika ada log, kita harus bisa membersihkannya dengan cara yang sederhana.

akan sangat menyenangkan, jika Anda dapat membuat perintah ke dalamnya. ini sepertinya tidak sulit.
ribuan orang akan sangat senang karena tidak perlu menelusuri semuanya.

Jika Anda menggunakan docker-compose, gunakan lazydocker untuk melihat log. Maka tidak perlu menghapus log. Anda mendapatkan log langsung dan mulai dengan log terbaru. Ini sangat membantu dalam proses debug.

grafik

https://github.com/jesseduffield/lazydocker
Anda dapat menginstalnya dengan satu baris dan ini adalah alat pemantauan yang baik. Sangat disayangkan bahwa orang-orang tidak begitu masuk akal untuk memahami bahwa fungsi "hapus log" adalah hal yang baik.

Tapi solusi dengan buruh pelabuhan yang malas melakukannya untuk saya. Terima kasih jesseduffield karena memberi kami kemungkinan untuk bermalas-malasan dengan alat pemantauan Anda :-)
Mungkin pertimbangkan untuk menyumbang ke lazydocker jika ini membuat debugging / pemantauan untuk Anda juga lebih mudah.
Dan buat kamu para pengembang / pengelola buruh pelabuhan: kenapa interface dari buruh pelabuhan tidak seperti itu?
Docker cukup mengagumkan, tapi lihatlah lazydocker; masih ada ruang untuk perbaikan.

+2147483647

+49324893

Apakah halaman ini membantu?
0 / 5 - 0 peringkat