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]
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:
logs
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
Lihatlah dokumen itu:
https://docs.docker.com/engine/admin/logging/overview/
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:
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.
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
Komentar yang paling membantu
docker logs -c (clear) <container>
akan bagus.+1