事情本身不复杂,线索都在日志里。Ubuntu 22.04 上为了统一日志,把 daemon.json 的 log-driver 改成 journald,重启后 docker logs -f 一个 Java 容器,屏幕上什么都不打,journalctl 里却能查到。
第一反应是「docker 的 journald 驱动和系统的 journald 限流撞上,日志被丢弃」,验证下来不成立。
这类报错背后常见的原因有几处,逐个排除就行。journald 驱动下 docker logs 只能读 journal,容器是改驱动之前创建的,日志还留在 json-file 里。还有一种是容器的日志写到了 stderr,journald 里带不同的优先级字段。
少数情况下是容器是以 --log-driver none 起的,本身就没有日志。
上来先确认容器当前用的日志驱动
docker inspect -f '{{.HostConfig.LogConfig.Type}}' app
到 journald 里按容器名查日志
journalctl CONTAINER_NAME=app -n 100 --no-pager
接着重建容器让新驱动生效
docker compose up -d --force-recreate app
等前面都确认过,再确认两种方式都能看到日志
docker logs --tail 20 app && journalctl -n 5 CONTAINER_NAME=app
改完先别撤,确认这几项。docker logs 能正常输出最近 20 行,journalctl 按 CONTAINER_NAME 也能查到同样内容,两边时间戳一致。
提醒一点。日志驱动只在创建容器时生效,改配置必须重建容器;journald 默认有速率限制,高流量容器要调 RateLimitBurst 否则会丢日志。这类问题最好一次改到位,反复小改反而容易把原因搅混。
