Skip to content
VDS · Docker dan kontainer

Log container dan cara agar tidak hilang

Di mana log Docker disimpan, cara membatasi ukurannya agar tidak memenuhi disk, dan apa yang harus dilakukan agar catatan tetap ada saat container dibuat ulang.

Diperbarui 23 Agustus 2026

Saat sebuah layanan mati, log adalah satu-satunya sumber kebenaran. Secara bawaan Docker menulisnya ke file di samping container dan tidak memberi batas ukurannya: aplikasi yang cerewet bisa memenuhi seluruh disk dalam sepekan.

Cara membaca

docker logs -f --tail 100 <container>
docker compose logs -f app
docker compose logs --since 30m --timestamps app
docker logs <container> 2>&1 | grep -i error | tail -50

Perlu diingat: Docker menampilkan apa yang ditulis aplikasi ke standard output dan standard error. Jika aplikasi menulis ke file-nya sendiri di dalam container, docker logs tidak akan menampilkan apa pun — Anda harus mencari log di dalam atau mengalihkan outputnya.

docker compose exec app ls -la /var/log

Batasi ukurannya sekarang juga

Pengaturan global untuk semua container ada di /etc/docker/daemon.json:

{
  "log-driver": "json-file",
  "log-opts": { "max-size": "20m", "max-file": "3" }
}
sudo systemctl restart docker

Pengaturan ini berlaku untuk container yang dibuat setelah restart. Container yang sedang berjalan harus dibuat ulang. Untuk satu layanan, hal yang sama dituliskan ke Compose:

services:
  app:
    logging:
      driver: json-file
      options:
        max-size: "20m"
        max-file: "3"

Hasilnya: tidak lebih dari 60 MB per layanan, bukan pertumbuhan tanpa batas.

Periksa ukuran saat ini sebelum membuat Anda terkejut: sudo du -sh /var/lib/docker/containers/*/*-json.log | sort -h | tail. Anda tidak bisa memangkas file yang sedang berjalan dengan rm — ruangnya tidak dibebaskan selama Docker memegang deskriptornya. Cara yang benar: buat ulang container atau sudo truncate -s 0 <file>.

Buat log bertahan melewati container

File log terhapus bersama container. Jika riwayatnya penting, serahkan ke system journal:

logging:
  driver: journald
  options:
    tag: "myapp"
journalctl -t myapp -n 200 --since today
journalctl -t myapp -p err --since "2 days ago"

journald memutar catatan dengan sendirinya dan dibatasi oleh pengaturan SystemMaxUse di /etc/systemd/journald.conf. Untuk memeriksa berapa banyak ruang yang dipakainya: journalctl --disk-usage.

Untuk beberapa layanan sekaligus, lebih praktis mengumpulkan semuanya di satu tempat — misalnya dengan container collector khusus yang menyimpan catatan dalam file per hari. Tapi mulailah dengan journald: ia sudah ada dan tidak memakan biaya.

Apa yang harus dicari saat men-debug gangguan

  1. 200 baris terakhir sebelum crash: docker logs --tail 200 <container>.
  2. Exit code: docker inspect -f '{{.State.ExitCode}} {{.State.OOMKilled}}' <container>. Kode 137 dan true pada OOMKilled berarti kernel membunuh proses karena kehabisan memori — lihat batas sumber daya.
  3. Log sistem mesin: sudo dmesg -T | tail -50 akan menunjukkan pembunuhan akibat kehabisan memori dan error disk.

Kesalahan umum

  • Disk penuh oleh log dan semua layanan mati. Membatasi ukuran adalah keharusan tepat setelah memasang Docker.
  • Melihat log container yang sudah terhapus. Setelah docker compose down log itu hilang. Kumpulkan catatan ke journald sebelumnya.
  • Rahasia di dalam log. Aplikasi gemar mencetak connection string beserta password. Siapa pun yang punya akses ke mesin bisa membaca log.
  • Mencari error di konsol teks. Ukurannya selalu 80×24 dan baris panjang terpotong. Untuk membaca log, SSH atau konsol “Screen” lebih praktis.