在Docker中打印和管理日志是容器运维的重要部分,以下是几种常用的日志打印方法:
# 查看容器标准输出日志
docker logs <container_name_or_id>
# 实时查看日志(类似tail -f)
docker logs -f <container_name_or_id>
# 查看最后N行日志
docker logs --tail=100 <container_name_or_id>
# 查看特定时间段的日志
docker logs --since="2023-01-01" --until="2023-01-02" <container_name_or_id>
Docker支持多种日志驱动,可以在运行容器时指定:
# 使用json-file驱动(默认)
docker run --log-driver=json-file --log-opt max-size=10m --log-opt max-file=3 myapp
# 使用syslog驱动
docker run --log-driver=syslog --log-opt syslog-address=udp://localhost:514 myapp
# 使用journald驱动(Linux系统)
docker run --log-driver=journald myapp
最佳实践是将日志输出到标准输出(stdout)和标准错误(stderr),而不是文件:
# Python示例
import logging
import sys
logging.basicConfig(
stream=sys.stdout,
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
logger.info("This will be captured by Docker")
Nginx: 修改配置将错误日志输出到stderr
error_log /dev/stderr warn;
access_log /dev/stdout main;
Apache: 修改配置
ErrorLog /dev/stderr
CustomLog /dev/stdout combined
version: '3'
services:
web:
image: nginx
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
可以将Docker日志发送到集中式日志系统:
# 使用Fluentd驱动
docker run --log-driver=fluentd --log-opt fluentd-address=localhost:24224 myapp
# 使用ELK栈
docker run --log-driver=gelf --log-opt gelf-address=udp://localhost:12201 myapp
# 查看所有容器的日志磁盘使用情况
docker system df
# 清理日志(谨慎使用,会删除所有停止的容器日志)
docker system prune
通过以上方法,您可以有效地管理和查看Docker容器产生的日志信息。