Skip to main content
BlogDevOps

Cara Melihat Docker Logs: Tail, Follow, dan Compose

Cara melihat docker logs untuk pemula: tail, follow, since, timestamps, docker compose logs, membaca container yang terus restart, dan rotasi max-size.

Matthews Wong

Software Engineer

Oktober 202610 menit baca
Cara Melihat Docker Logs: Tail, Follow, dan Compose

Ringkasan Utama

Cara melihat docker logs: jalankan docker logs --tail 50 nama-container untuk 50 baris terakhir, tambahkan -f untuk mengikuti log langsung dan --since 10m untuk membatasi waktu. Untuk proyek Compose pakai docker compose logs web. Kalau container terus restart, baca log container itu dulu, dan batasi ukuran log dengan max-size dan max-file.

Container kamu sudah jalan, tetapi halaman tidak terbuka, atau status container berubah jadi Restarting terus-menerus. Kamu mengetik docker logs nama-container dan terminal langsung dibanjiri ribuan baris yang bergulir terlalu cepat untuk dibaca. Pemula biasanya tersangkut di tiga titik: tidak tahu nama container yang benar, tidak tahu cara membatasi output, dan tidak tahu bahwa container yang sudah mati pun masih bisa dibaca lognya.

Panduan ini membawamu lewat tujuh langkah, dari mencari nama container sampai membatasi ukuran log supaya disk tidak penuh. Setiap perintah dan flag saya cocokkan dengan dokumentasi resmi Docker, dan contoh memakai nama placeholder web untuk container dan layanan. Pola terakhir di panduan ini sama dengan yang dipakai file docker-compose.yml situs ini: driver json-file dengan max-size 10m dan max-file 3.

Ingin paham dulu ke mana baris log pergi dan siapa yang menyimpannya? Ikuti pelajaran gratis Docker Logs untuk Pemula: Baca, Batasi, dan Rotasi Log di jalur DevOps from zero, lengkap dengan penjelasan interaktif.

Yang kamu butuhkan

Tidak banyak, cukup tiga hal berikut sudah siap sebelum mulai.

  • Docker terpasang di komputer atau server, dan kamu bisa menjalankan perintah docker di terminal.
  • Minimal satu container yang sedang atau pernah berjalan. Contoh di bawah memakai nama web, ganti dengan namamu sendiri.
  • Untuk langkah 5, sebuah proyek Docker Compose dengan layanan bernama web. Kalau belum punya, langkah lain tetap bisa diikuti.

Langkah 1: Cari nama container yang benar

Semua perintah log butuh nama atau ID container. Jalankan docker ps dengan -a, karena tanpa -a Docker hanya menampilkan container yang sedang berjalan dan container yang sudah mati tidak kelihatan.

# -a also lists containers that have stopped or crashed
docker ps -a

# Only the names, one per line
docker ps -a --format '{{.Names}}'

# Columns include STATUS: "Up ...", "Restarting ...", "Exited (1) ..."
# The last column (NAMES) is what you pass to docker logs.

Lihat kolom STATUS. Up berarti sehat, Restarting berarti Docker sedang menjalankannya ulang karena kebijakan restart, dan Exited diikuti angka berarti prosesnya sudah selesai atau mati dengan kode tersebut. Salin isi kolom NAMES untuk langkah berikutnya.

Langkah 2: Baca log dengan docker logs dan --tail

Perintah dasarnya docker logs nama-container, dan secara default ia menampilkan semua baris dari awal. Untuk container yang sudah lama jalan itu terlalu banyak. Tambahkan --tail atau -n untuk hanya melihat sejumlah baris terakhir.

# Wrong: dumps the container's whole history into your terminal
docker logs web

# Right: only the last 50 lines (-n is the short form of --tail)
docker logs --tail 50 web
docker logs -n 50 web

Docker menangkap standard output dan standard error dari proses utama container, jadi yang kamu lihat adalah apa yang dicetak aplikasi. Kalau aplikasi menulis ke file lognya sendiri, docker logs bisa tampak kosong. Arahkan aplikasi untuk mencetak ke stdout dan stderr.

Langkah 3: Ikuti log secara langsung dengan -f

Saat kamu sedang menguji sesuatu, misalnya membuka halaman lalu melihat error yang muncul, pakai --follow atau -f. Docker terus mengalirkan baris baru ke terminal. Gabungkan dengan --tail supaya kamu mulai dari konteks terakhir, bukan dari seluruh riwayat.

# Show the last 50 lines, then keep streaming new ones
docker logs --tail 50 --follow web

# Short form of the same thing
docker logs -n 50 -f web

# Press Ctrl+C to stop watching. The container keeps running.

Ctrl+C hanya menghentikan tampilan di terminalmu. Container tetap berjalan. Ini kebingungan yang sering muncul pada pemula: mereka takut menekan Ctrl+C karena mengira aplikasinya ikut mati.

Langkah 4: Persempit dengan --since dan --timestamps

Kalau masalah terjadi beberapa menit lalu, --since menampilkan hanya baris yang lebih baru dari waktu tertentu. Nilainya bisa durasi seperti 10m atau 3h, tanggal RFC 3339, atau UNIX timestamp. --until adalah pasangannya untuk batas akhir, dan --timestamps menambahkan waktu di depan setiap baris.

# Only lines from the last 10 minutes (a Go duration: 42m, 1m30s, 3h)
docker logs --since 10m web

# Add a timestamp in front of every line
docker logs --since 10m --timestamps web
# Each line then starts like: 2014-09-16T06:17:46.000000000Z <your line>

# A window: from an absolute time, until an hour later (the Z means UTC)
docker logs --since 2013-01-02T13:23:37Z --until 2013-01-02T14:23:37Z web

Kalau kamu tidak menulis zona waktu di nilai absolut, klien memakai zona waktu lokal komputermu. Tambahkan Z di akhir bila kamu ingin UTC, terutama saat membandingkan dengan log dari server yang zonanya berbeda.

Langkah 5: Pakai docker compose logs untuk proyek Compose

Kalau container dibuat lewat Docker Compose, gunakan docker compose logs. Perintah ini menerima nama layanan, yaitu nama di file compose, bukan container_name. Tanpa nama layanan, ia menampilkan log semua layanan sekaligus dengan awalan nama layanan di setiap baris.

# All services of the project, last 50 lines each
docker compose logs --tail 50

# One service, followed, with timestamps
docker compose logs --tail 50 --follow --timestamps web

# Several services at once: list their names
docker compose logs --tail 50 web db

# Drop the "web  | " prefix if you want to copy the lines elsewhere
docker compose logs --no-log-prefix --tail 50 web

Flag-nya mirip: --follow, --tail, --since, --until, dan --timestamps, ditambah --no-log-prefix untuk membuang awalan. Perhatikan bahwa --tail berlaku per container, dan nilai defaultnya adalah semua baris, jadi biasakan menulisnya.

Langkah 6: Baca container yang terus restart

Container yang crash lalu dijalankan ulang oleh kebijakan restart adalah kasus paling umum yang membuat pemula panik. Di docker ps -a statusnya berganti antara Restarting dan Exited. Tenang: log percobaan sebelumnya masih ada, dan di sanalah penyebabnya tertulis. Jalankan tiga perintah di bawah, berurutan.

# 1. Look at the STATUS column: Restarting, or Exited (some number)
docker ps -a

# 2. Read the end of that container's log, with times
docker logs --tail 100 --timestamps web

# 3. Or only the most recent attempt
docker logs --since 2m web

Cari error pertama dalam satu percobaan, bukan baris terakhir. Baris terakhir biasanya hanya akibat, misalnya proses keluar karena konfigurasi yang hilang. Dokumentasi Docker juga menjelaskan bahwa kebijakan restart baru berlaku setelah container berjalan setidaknya 10 detik, supaya container yang tidak pernah bisa start tidak masuk loop restart.

# Wrong: read only the last line, usually fallout of an earlier error
docker logs --tail 1 web

# Right: read from the first error of the attempt, then follow the chain
docker logs --tail 100 --timestamps web

Jangan menghapus container yang crash (docker rm) sebelum membaca lognya. Log json-file disimpan per container, jadi menghapus container berarti kehilangan bukti yang kamu cari. Baca dan salin dulu bagian yang penting.

Langkah 7: Cek driver dan batasi ukuran log

Docker memakai driver json-file secara default, dan driver ini tidak merotasi log kecuali kamu mengaturnya. Di server yang berjalan berbulan-bulan, satu file log yang terus membesar bisa memenuhi disk. Periksa driver sebuah container dengan docker inspect, lalu batasi lewat blok logging di file compose. Nilai max-size dan max-file harus berupa string, jadi ditulis dengan tanda kutip.

# Which driver does this container use?
docker inspect -f '{{.HostConfig.LogConfig.Type}}' web

# Where is its log file on the host?
docker inspect --format='{{.LogPath}}' web
# docker-compose.yml, under the service (the same block this site uses)
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"
# Wrong: max-file alone. It does nothing unless max-size is also set.
max-file: "3"

# Right: set both, as strings.
max-size: "10m"
max-file: "3"

Dengan max-size 10m dan max-file 3, Docker menyimpan paling banyak tiga file sekitar 10 MB, dan yang tertua dihapus saat file baru dibuat. Pengaturan ini hanya berlaku untuk container yang dibuat sesudahnya. Container yang sudah ada mempertahankan opsi lamanya, jadi buat ulang container-nya dengan docker compose up -d --force-recreate.

Error umum dan cara memperbaikinya

Enam gejala yang paling sering membuat pemula bingung saat membaca log container.

GejalaPenyebabPerbaikan
docker logs tidak menampilkan apa-apa padahal container jalanAplikasi menulis ke file lognya sendiri, bukan ke stdout dan stderr.Arahkan aplikasi ke stdout dan stderr, atau kaitkan file lognya ke keduanya seperti image nginx resmi.
Terminal banjir ribuan baris--tail tidak diisi, defaultnya semua baris.Tambahkan --tail 50, atau --since 10m untuk membatasi waktu.
No such container saat menjalankan docker logsNama salah, atau container sudah dihapus. Tanpa -a pada docker ps, container yang mati tidak terlihat.Cek nama dengan docker ps -a. Kalau memakai Compose, container_name bisa berbeda dari nama layanan.
docker compose logs web gagal menemukan layananArgumen yang diminta adalah nama layanan di file compose, bukan nama container.Pakai nama layanan persis seperti di file compose, atau jalankan docker compose logs tanpa argumen.
Log lama hilang setelah beberapa hariRotasi max-size dan max-file membuang file yang tertua.Naikkan max-file atau max-size kalau perlu riwayat lebih lama. Untuk log yang harus awet, simpan di tempat yang memang dibuat untuk itu.
Sudah mengubah daemon.json tetapi container lama tetap tidak dirotasiDefault baru hanya berlaku untuk container yang dibuat setelah Docker di-restart. Atau max-file diisi tanpa max-size.Buat ulang container, isi max-size dan max-file bersamaan, lalu cek dengan docker inspect.

Checklist sebelum menutup terminal

  • Saya tahu nama container atau layanan yang benar dari docker ps -a.
  • Saya selalu memakai --tail atau --since supaya output tidak membanjir.
  • Saya membaca error pertama dalam satu percobaan, bukan baris terakhir.
  • Container yang crash tidak saya hapus sebelum lognya dibaca.
  • max-size dan max-file sudah diisi bersamaan, dan container sudah dibuat ulang.

Belajar lebih dalam

Panduan ini fokus pada perintahnya. Untuk memahami kenapa log disimpan seperti ini, apa bedanya json-file dengan journald, dan cara membaca log deploy yang gagal, ikuti pelajaran Docker Logs untuk Pemula: Baca, Batasi, dan Rotasi Log. Kalau kamu ingin membaca log server tanpa login SSH dulu, lihat juga membaca log production tanpa SSH.

Kebiasaan yang cukup untuk hampir semua masalah: cari namanya dengan docker ps -a, baca dengan --tail, persempit dengan --since, dan batasi ukuran log sebelum disk penuh. Sisanya adalah membaca dengan tenang dari error pertama.

FAQ

Pertanyaan Umum

Jawaban singkat untuk pertanyaan yang paling sering diajukan pembaca tentang topik ini.

Bagaimana cara melihat docker logs dari container yang sedang jalan?

Jalankan docker logs --tail 50 nama-container untuk melihat 50 baris terakhir. Tambahkan -f (--follow) untuk terus mengikuti baris baru, dan --since 10m untuk hanya menampilkan sepuluh menit terakhir. Cari dulu nama container dengan docker ps -a.

Kenapa docker logs kosong padahal container berjalan?

Docker hanya menangkap apa yang ditulis proses utama ke standard output dan standard error. Kalau aplikasi menulis ke file lognya sendiri di dalam container, docker logs tidak punya apa-apa untuk ditampilkan. Arahkan aplikasi ke stdout dan stderr, atau kaitkan file lognya ke keduanya.

Apakah log container yang crash atau berhenti masih bisa dibaca?

Bisa, selama container-nya belum dihapus. Cari dengan docker ps -a yang juga menampilkan container yang berhenti, lalu jalankan docker logs --tail 100 --timestamps padanya. Jangan hapus container dengan docker rm sebelum lognya terbaca, karena log json-file disimpan per container.

Apa bedanya docker logs dan docker compose logs?

docker logs membaca satu container berdasarkan nama atau ID. docker compose logs membaca layanan dalam proyek Compose, menerima nama layanan sebagai argumen, dan tanpa argumen menampilkan semua layanan dengan awalan di setiap baris. Keduanya menerima --follow, --tail, --since, dan --timestamps.

Kenapa file log Docker memakan banyak ruang disk?

Driver json-file bawaan tidak merotasi log kecuali kamu mengisi max-size, dan max-file hanya berfungsi bila max-size juga diisi. Tambahkan blok logging dengan max-size 10m dan max-file 3 di file compose, lalu buat ulang container karena container yang sudah ada mempertahankan opsi lamanya.