Saya gunakan docker logs [container-name]
untuk melihat log dari wadah tertentu.
Apakah ada cara yang elegan untuk menghapus log ini?
docker
docker-compose
boot2docker
docker-machine
Youssouf Maiga
sumber
sumber
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"
Jawaban:
Dari pertanyaan ini ada satu garis yang dapat Anda jalankan:
atau ada perintah truncate yang serupa:
Saya bukan penggemar berat dari mereka karena mereka memodifikasi file Docker secara langsung. Penghapusan log eksternal dapat terjadi saat buruh pelabuhan sedang menulis data diformat json ke file, menghasilkan garis parsial, dan melanggar kemampuan untuk membaca log dari
docker logs
cli.Sebagai gantinya, Anda dapat membuat Docker secara otomatis memutar log untuk Anda. Ini dilakukan dengan flag tambahan untuk dockerd jika Anda menggunakan driver logging JSON default :
Anda juga dapat mengatur ini sebagai bagian dari file daemon.json Anda alih-alih memodifikasi skrip startup Anda:
Opsi ini perlu dikonfigurasi dengan akses root. Pastikan untuk menjalankan
systemctl reload docker
setelah mengubah file ini agar pengaturan diterapkan. Pengaturan ini kemudian akan menjadi default untuk setiap wadah yang baru dibuat. Catatan, wadah yang ada perlu dihapus dan dibuat ulang untuk menerima batas log yang baru.Opsi log yang serupa dapat diteruskan ke masing-masing kontainer untuk menimpa default ini, memungkinkan Anda untuk menyimpan lebih banyak atau lebih sedikit log pada masing-masing kontainer. Dari
docker run
ini terlihat seperti:atau dalam file penulisan:
Untuk penghematan ruang tambahan, Anda dapat beralih dari driver log json ke driver log "lokal". Dibutuhkan opsi max-size dan max-file yang sama, tetapi alih-alih menyimpannya di json ia menggunakan sintaks biner yang lebih cepat dan lebih kecil. Ini memungkinkan Anda untuk menyimpan lebih banyak log dalam file berukuran sama. Entri daemon.json untuk itu terlihat seperti:
Kelemahan dari driver lokal adalah parser / forwarder log eksternal yang bergantung pada akses langsung ke json log tidak lagi berfungsi. Jadi jika Anda menggunakan alat seperti filebeat untuk mengirim ke Elastic, atau forwarder universal Splunk, saya akan menghindari driver "lokal".
Saya mendapat sedikit lebih banyak tentang ini dalam presentasi Kiat dan Trik saya .
sumber
service docker restart
yang dengan sendirinya tidak berhasil. Juga harus membuat wadah baru sebelum diberlakukan. yaitu hanya memunculkan wadah lama tidak menerapkan logging baruecho -n > ...
. Bagaimanapun, saya ingin dapat memiliki kontrol lebih besar atas log saya. Sebagai contoh, setelah restart docker-compose , saya akan senang memiliki mekanisme untuk melakukan sesuatu dengan log yang diawetkan.Menggunakan:
Anda mungkin perlu sudo
ref. Jeff S. Bagaimana menghapus log dengan benar untuk wadah Docker?
Referensi: Memotong file saat sedang digunakan (Linux)
sumber
containers
tidak tersedia sebaliknya.sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
- bekerja untuk sayaerror from daemon in stream: Error grabbing logs: invalid character '\x00' looking for beginning of value
Pada Docker untuk Windows dan Mac, dan mungkin yang lain juga, dimungkinkan untuk menggunakan opsi ekor. Sebagai contoh:
Dengan cara ini, hanya 100 baris terakhir yang ditampilkan, dan Anda tidak perlu terlebih dahulu menggulir melalui garis 1M ...
(Dan dengan demikian, menghapus log mungkin tidak perlu)
sumber
sumber
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"
, hanya mendapatkan total ukuran logsudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log | grep total"
Anda dapat mengatur logrotate untuk menghapus log secara berkala.
Contoh file di /etc/logrotate.d/docker-logs
sumber
docker run
? file/etc/logrotate.d/docker-logs
tidak ada, saya harus membuatnya?"log-opts"
seperti yang ditunjukkan oleh BMitch)Docker4Mac, solusi 2018:
Baris pertama mendapatkan jalur file log, mirip dengan jawaban yang diterima.
Baris kedua menggunakan
nsenter
yang memungkinkan Anda untuk menjalankan perintah dixhyve
VM yang server sebagai tuan rumah untuk semua kontainer buruh pelabuhan di bawah Docker4Mac. Perintah yang kami jalankan adalah jawaban yang tidak asingtruncate -s0 $LOGPATH
untuk Mac.Jika Anda menggunakan
docker-compose
, baris pertama menjadi:dan
<service>
nama layanan daridocker-compose.yml
file Anda .Berkat https://github.com/justincormack/nsenter1 untuk
nsenter
caranya.sumber
docker run -it --rm --privileged --pid=host alpine:latest nsenter -t 1 -m -u -n -i -- sh -c 'truncate -s0 /var/lib/docker/containers/*/*-json.log'
Anda tidak dapat melakukan ini secara langsung melalui perintah Docker.
Anda dapat membatasi ukuran log, atau menggunakan skrip untuk menghapus log yang terkait dengan sebuah wadah. Anda dapat menemukan contoh skrip di sini (baca dari bawah): Fitur: Kemampuan untuk menghapus riwayat log # 1083
Lihat bagian logging dari referensi file komposisi buruh pelabuhan, di mana Anda dapat menentukan opsi (seperti rotasi log dan batas ukuran log) untuk beberapa driver logging.
sumber
Sebagai pengguna root , cobalah untuk menjalankan yang berikut:
atau
atau
sumber
Di server Ubuntu saya bahkan sebagai sudo saya akan dapatkan
Cannot open ‘/var/lib/docker/containers/*/*-json.log’ for writing: No such file or directory
Tetapi menyisir buruh pelabuhan memeriksa dan memotong jawaban berhasil:
sumber
Saya lebih suka yang ini (dari solusi di atas):
Namun saya menjalankan beberapa sistem (Ubuntu 18.x Bionic misalnya), di mana jalur ini tidak berfungsi seperti yang diharapkan. Docker dipasang melalui Snap, sehingga jalur ke wadah lebih seperti:
sumber
Anda juga dapat menyediakan parameter log-opts pada
docker run
baris perintah, seperti ini:atau di docker-compose.yml seperti ini
Kredit: https://medium.com/@Quigley_Ja/rotating-docker-logs-keeping-your-overlay-folder-small-40cfa2155412 (James Quigley)
sumber
"5"
dan"10m"
masing - masing), seperti yang ditunjukkan di sini untuk file daemon.json global, tetapi itu sama untuk docker-compose.yml. Dalam kedua kasus, itu hanya akan mempengaruhi wadah yang baru dibuat."5"
berfungsi. The10m
bekerja tanpa mengutip memang.Docker untuk pengguna Mac, berikut solusinya:
Temukan jalur file log dengan:
$ docker inspect | grep log
SSH ke mesin buruh pelabuhan (misalkan namanya
default
, jika tidak, jalankandocker-machine ls
untuk mencari tahu):$ docker-machine ssh default
Ubah ke root pengguna ( referensi ):
$ sudo -i
Hapus konten file log:
$ echo "" > log_file_path_from_step1
sumber
docker exec -it default sh
untuk memasukkan shell sh dalam wadah. Namun, banyak kontainer tidak secara implisit membuatsudo
perintah tersedia.