Saya gunakan docker logs [container-name]
untuk melihat log dari wadah tertentu.
Apakah ada cara yang elegan untuk menghapus log ini?
Saya gunakan docker logs [container-name]
untuk melihat log dari wadah tertentu.
Apakah ada cara yang elegan untuk menghapus log ini?
Jawaban:
Dari pertanyaan ini ada satu garis yang dapat Anda jalankan:
echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
atau ada perintah truncate yang serupa:
truncate -s 0 $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
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 :
dockerd ... --log-opt max-size=10m --log-opt max-file=3
Anda juga dapat mengatur ini sebagai bagian dari file daemon.json Anda alih-alih memodifikasi skrip startup Anda:
{
"log-driver": "json-file",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
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:
docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 ...
atau dalam file penulisan:
version: '3.7'
services:
app:
image: ...
logging:
options:
max-size: "10m"
max-file: "3"
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:
{
"log-driver": "local",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
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 .
service docker restart
yang dengan sendirinya tidak berhasil. Juga harus membuat wadah baru sebelum diberlakukan. yaitu hanya memunculkan wadah lama tidak menerapkan logging baru
echo -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:
truncate -s 0 /var/lib/docker/containers/*/*-json.log
Anda mungkin perlu sudo
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
ref. Jeff S. Bagaimana menghapus log dengan benar untuk wadah Docker?
Referensi: Memotong file saat sedang digunakan (Linux)
containers
tidak tersedia sebaliknya.
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
- bekerja untuk saya
error 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:
docker logs -f --tail 100
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)
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
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
/var/lib/docker/containers/*/*.log {
rotate 7
daily
compress
size=50M
missingok
delaycompress
copytruncate
}
docker run
? file /etc/logrotate.d/docker-logs
tidak ada, saya harus membuatnya?
"log-opts"
seperti yang ditunjukkan oleh BMitch)
Docker4Mac, solusi 2018:
LOGPATH=$(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
docker run -it --rm --privileged --pid=host alpine:latest nsenter -t 1 -m -u -n -i -- truncate -s0 $LOGPATH
Baris pertama mendapatkan jalur file log, mirip dengan jawaban yang diterima.
Baris kedua menggunakan nsenter
yang memungkinkan Anda untuk menjalankan perintah di xhyve
VM yang server sebagai tuan rumah untuk semua kontainer buruh pelabuhan di bawah Docker4Mac. Perintah yang kami jalankan adalah jawaban yang tidak asing truncate -s0 $LOGPATH
untuk Mac.
Jika Anda menggunakan docker-compose
, baris pertama menjadi:
local LOGPATH=$(docker inspect --format='{{.LogPath}}' $(docker-compose ps -q <service>))
dan <service>
nama layanan dari docker-compose.yml
file Anda .
Berkat https://github.com/justincormack/nsenter1 untuk nsenter
caranya.
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.
Sebagai pengguna root , cobalah untuk menjalankan yang berikut:
> /var/lib/docker/containers/*/*-json.log
atau
cat /dev/null > /var/lib/docker/containers/*/*-json.log
atau
echo "" > /var/lib/docker/containers/*/*-json.log
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:
sudo truncate -s 0 `docker inspect --format='{{.LogPath}}' <container>`
Saya lebih suka yang ini (dari solusi di atas):
truncate -s 0 /var/lib/docker/containers/*/*-json.log
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:
truncate -s 0 /var/snap/docker/common/var-lib-docker/containers/*/*-json.log
Anda juga dapat menyediakan parameter log-opts pada docker run
baris perintah, seperti ini:
docker run --log-opt max-size=10m --log-opt max-file=5 my-app:latest
atau di docker-compose.yml seperti ini
my-app:
image: my-app:latest
logging:
driver: "json-file"
options:
max-file: "5"
max-size: 10m
Kredit: https://medium.com/@Quigley_Ja/rotating-docker-logs-keeping-your-overlay-folder-small-40cfa2155412 (James Quigley)
"5"
berfungsi. The 10m
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, jalankan docker-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
docker exec -it default sh
untuk memasukkan shell sh dalam wadah. Namun, banyak kontainer tidak secara implisit membuat sudo
perintah tersedia.
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"