Kontainer Docker yang berjalan lama dapat dengan cepat mengakumulasi sejumlah besar baris log. Ini menghabiskan kapasitas penyimpanan dan mengurangi kinerja saat mengakses dan memfilter data. Meskipun Docker menyertakan alat terintegrasi untuk melihat log, tidak ada mekanisme bawaan untuk membersihkannya.
Dalam artikel ini Anda akan mempelajari cara menghapus log dari container Docker yang sedang berjalan, tanpa memulai ulang atau menggantinya. Anda juga akan melihat beberapa teknik untuk menangani log besar dengan lebih efisien sambil mempertahankan data lama.
Memahami Masalah
Docker mengumpulkan log dari output standar dan aliran kesalahan proses latar depan kontainer. Itu docker logs
perintah digunakan untuk mengambil log ini tetapi tidak membiarkan Anda menghapus baris lama.
Docker mendukung banyak driver logging yang berbeda sehingga tidak mungkin untuk menawarkan mekanisme pembersihan standar. Artikel ini berfokus pada standar json-file
logging driver, tempat baris log disimpan dalam file JSON di sistem file host container Anda. Lihat dokumentasi driver penyimpanan Anda jika Anda perlu membersihkan log yang dialirkan ke host jarak jauh.
File log yang dibuat oleh json-file
driver disimpan di bawah /var/lib/docker/containers
direktori. Setiap kontainer mendapatkan file lognya sendiri yang digunakan sepanjang masa pakainya. Tidak ada rotasi log yang dikonfigurasi secara default.
Menghapus file log saja bukanlah solusi yang efektif. Docker mengharapkan file tersedia terus-menerus dan tidak akan membuat ulang secara otomatis jika dihapus. Lebih aman untuk jernih isi log yang ada untuk menghindari pengaruh penulisan saat ini.
Menemukan Jalur File Log
Pertama, temukan jalur ke file log penampung target Anda. Anda dapat mengambil jalur file log untuk wadah yang disebut my-app
dengan menjalankan perintah berikut:
$ docker inspect --format=".LogPath" my-app /var/lib/containers/1380d936...-json.log
Menghapus File Log
Anda dapat menghapus konten log tanpa menghapusnya dengan menggemakan string kosong ke dalam kontennya. File akan dimiliki oleh root
jadi Anda harus melakukan operasi ini di shell root. Perintah berikut akan mengosongkan file log untuk Anda:
$ sudo sh -c 'echo "" > $(docker inspect --format=".LogPath" my-app)'
Interpolasi shell digunakan untuk secara dinamis mengambil jalur file log untuk my-app
wadah. Anda dapat mengganti secara manual di jalur yang diambil sebelumnya.
Saat kamu berlari docker logs my-app
Anda sekarang akan melihat keluaran kosong kecuali wadah telah melanjutkan penulisan baris untuk sementara.
Membatasi Keluaran Log
Itu docker logs
perintah menerima beberapa argumen yang dapat digunakan untuk membatasi output dari log yang bising. Ini membantu mengurangi kebutuhan untuk membersihkan log sambil mencegah terminal Anda dibanjiri dengan baris lama setiap kali Anda mengakses file.
--tail
– Bendera ini menginstruksikan Docker untuk hanya memancarkan sejumlah baris log lama tertentu, dimulai dengan yang terbaru.--until
dan--since
– Bendera ini membatasi output ke garis log yang dipancarkan selama periode waktu tertentu. Mereka berguna saat Anda mengetahui perkiraan jangka waktu terjadinya suatu peristiwa.
Berikut adalah beberapa contoh:
Tampilkan 100 baris log terbaru
docker logs my-app --tail 100
Tampilkan baris log yang ditulis dalam satu jam terakhir
docker logs my-app --since 1h
Tampilkan hingga 100 baris log yang ditulis dalam satu jam terakhir
docker logs my-app --tail 100 --since 1h
Menyiapkan Rotasi Log
Secara teratur harus membersihkan file log dengan cara ini biasanya menandakan bahwa log aplikasi Anda terlalu bertele-tele atau terlalu banyak aktivitas untuk disimpan dalam satu file.
Banyak driver logging Docker, termasuk json-file
memiliki dukungan rotasi log opsional yang dapat Anda aktifkan secara global untuk daemon Docker atau per container.
Pengaturan daemon dikonfigurasi di /etc/docker/daemon.json
. Berikut adalah contoh yang memutar log kontainer setelah mencapai 8MB. Hingga lima file akan disimpan setiap saat, dengan yang lama secara otomatis dihapus saat rotasi baru terjadi.
"log-opts": "max-size": "8m", "max-file": "5"
Mulai ulang daemon Docker untuk menerapkan perubahan:
$ sudo service docker restart
Rotasi tingkat daemon berlaku untuk semua container yang baru dibuat. Perubahan tidak akan memengaruhi penampung yang sudah ada di host Anda.
Rotasi dapat dikonfigurasi untuk wadah individu menggunakan --log-opts
bendera. Ini akan menggantikan pengaturan daemon Docker default Anda.
docker run --name app --log-driver json-file --log-opts max-size=8M --log-opts max-file=5 app-image:latest
Ringkasan
Log kontainer Docker bisa menjadi berisik saat aplikasi yang sibuk menulis output yang ekstensif. Akses ke log verbose berguna untuk debugging tetapi mereka menghabiskan ruang penyimpanan, mempersulit penyaringan data, dan dapat mengurangi kinerja.
Anda dapat membersihkan file log sesuai permintaan dengan menggunakan perintah shell untuk mengosongkan kontennya. Namun praktik yang lebih baik adalah mengatur rotasi log sehingga ini terjadi secara otomatis setelah file mencapai ukuran tertentu. Itu docker logs
command juga mendukung flag yang dapat membantu menjinakkan log yang sulit digunakan pada titik akses.