Skip to content

Docker - 日志

有效的日志记录对于监控应用程序和排查容器内部问题至关重要。Docker 提供了在容器层面和 Docker daemon(守护进程)层面进行日志记录的机制。

默认情况下,Docker 会捕获容器内部运行的主进程的标准输出(stdout)和标准错误(stderr)流。可以使用 docker logs 命令访问这些日志。

首先,确保你有一个正在运行的容器(例如,使用 docker run 启动的容器)。使用 docker ps 命令找到它的 ID 或名称。

# Example: Start a simple container that prints logs
docker run -d --name logger-test alpine sh -c 'while true; do echo "Log entry at $(date)"; sleep 5; done'

现在,查看其日志:

# View all logs for the container 'logger-test'
docker logs logger-test
# Follow the logs in real-time (like tail -f)
docker logs -f logger-test
# Show only the last 5 log entries
docker logs --tail 5 logger-test
# Show logs since a specific timestamp
docker logs --since 2023-10-27T10:00:00 logger-test
# Add timestamps to each log line (provided by Docker)
docker logs -t logger-test

Docker 使用日志驱动程序来确定容器日志发送到何处。默认的驱动程序是 json-file,它将日志作为 JSON 文件存储在 Docker 主机上(通常在 /var/lib/docker/containers/<container-id>/ 下)。

其他可用的驱动程序可以将日志发送到不同的目的地:

  • journald:将日志发送到 systemd journal(Linux)。
  • syslog:将日志发送到 syslog 服务器。
  • fluentd、gelf、awslogs、splunk、gcplogs:将日志发送到相应的集中式日志平台。
  • none:禁用容器的日志记录。

你可以在 Docker 守护进程配置文件(daemon.json)中配置所有容器的默认日志驱动程序,或者在使用 docker run 命令时通过 --log-driver 和 --log-opt 标志为每个容器指定驱动程序。

# Example: Run a container using the 'syslog' driver
docker run -d --log-driver=syslog --name my-syslog-app my-image

在生产环境中有效管理日志,尤其是在处理大量容器或需要集中式日志分析时,使用适当的日志驱动程序至关重要。

Docker 守护进程本身也会生成日志,这对于排查 Docker Engine 的问题非常有用。

访问守护进程日志的位置和方法取决于主机操作系统及其 init 系统:

  • **Linux (systemd):**使用 journalctl 查看守护进程日志:sudo journalctl -u docker.service。添加 -f 标志可以跟踪日志。
  • **Docker Desktop (Windows/Mac):**通常可以通过 Docker Desktop GUI(图形用户界面)的“排查故障”部分访问日志,或在特定的日志文件中找到(请查阅 Docker Desktop 文档以获取具体位置)。

你可以通过在 daemon.json 配置文件(例如,在 Linux 上是 /etc/docker/daemon.json)中设置 log-level 选项来更改守护进程日志的详细程度。

// Example /etc/docker/daemon.json excerpt
{
"log-level": "debug"
}

可用的级别通常包括 debug、info、warn、error、fatal。默认级别通常是 info。修改 daemon.json 后,请记住重启 Docker 守护进程(使用 sudo systemctl restart docker)。仅在积极排查问题时才使用 debug 级别,因为它会生成大量日志。