docker logs
docker logs tails a container’s stdout/stderr. By default everything stays on the host as JSON files. For production, ship logs off-host with a logging driver or a sidecar.
Tail, follow, drivers, structured
EXAMPLE
# 1) Basics
docker logs web # all logs since container start
docker logs -f web # follow (like tail -f)
docker logs --tail=100 -f web # last 100 + follow
docker logs --since=10m web # last 10 min
docker logs --until=2026-06-07T13:00 web
docker logs --timestamps -f web # prepend RFC3339 timestamps
# 2) Compose
docker compose logs -f # all services
docker compose logs -f web db # specific services
docker compose logs --tail=50 web
# 3) Default driver — json-file. Rotate or you'll fill the disk.
# /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "50m",
"max-file": "3"
}
}
# Reload: systemctl restart docker
# 4) Per-container override
docker run --log-driver=json-file \
--log-opt max-size=10m --log-opt max-file=3 my/app
# 5) Ship logs OFF the host
# fluentd
docker run --log-driver=fluentd \
--log-opt fluentd-address=10.0.0.5:24224 \
--log-opt tag=app.web my/app
# AWS CloudWatch
docker run --log-driver=awslogs \
--log-opt awslogs-region=us-east-1 \
--log-opt awslogs-group=/my/app my/app
# Loki / Grafana via promtail sidecar — common K8s pattern
# 6) STRUCTURED logs win — JSON to stdout, then parse downstream
console.log(JSON.stringify({ ts: Date.now(), level: 'error', msg: 'fail', request_id }));
# Don't write logs to /var/log/app.log inside the container — write to stdout.
# 7) Inspect log driver in use
docker inspect -f '{{.HostConfig.LogConfig.Type}}' web
Why it matters
Write to stdout, NEVER to files inside the container. The 12-factor rule plus Docker’s defaults make “stdout + a log driver” the universally-portable production logging story.
Tip: Tweak the snippet with Try it Yourself », then sit the quiz at the bottom of the page.
Discussion
Loading…