| 备注 | 修改日期 | 修改人 |
| 创建版本 | 2025-12-22 00:17:02[当前版本] | 文艺范儿 |
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 -t container_name_or_id # 组合使用:实时跟踪并显示时间戳 docker logs -ft container_name_or_id # 查看指定时间范围的日志 docker logs --since 2024-01-15T10:00:00 --until 2024-01-15T11:00:00 container_name
# 运行一个测试容器 docker run -d --name test-nginx nginx:alpine # 查看实时日志 docker logs -f test-nginx # 查看最近50行日志(带时间戳) docker logs --tail 50 -t test-nginx # 查看过去10分钟的日志 docker logs --since 10m test-nginx
FROM nginx:alpine
# 修改 Nginx 配置,将日志输出到标准输出和标准错误
RUN ln -sf /dev/stdout /var/log/nginx/access.log && \
ln -sf /dev/stderr /var/log/nginx/error.log
CMD ["nginx", "-g", "daemon off;"]
构建和运行:
docker build -t nginx-stdout -f Dockerfile . docker run -d --name nginx-test nginx-stdout docker logs -f nginx-test
略。。。
9.3.1 案例3:Python 应用 JSON 格式日志
略。。。
# 运行容器并配置日志驱动 docker run -d \ --name custom-log-app \ --log-driver=json-file \ --log-opt max-size=10m \ --log-opt max-file=3 \ --log-opt labels=environment \ --log-opt env=APP_ENV \ -l environment=production \ -e APP_ENV=production \ nginx:alpine # 实时查看 JSON 格式日志 docker logs -f custom-log-app
# 如果有 Fluentd 服务运行
docker run -d \
--name fluentd-log-app \
--log-driver=fluentd \
--log-opt fluentd-address=localhost:24224 \
--log-opt tag="docker.{{.Name}}" \
nginx:alpine
# 过滤包含特定关键词的日志 docker logs container_name | grep "ERROR" # 过滤并显示行号 docker logs container_name | grep -n "404" # 使用正则表达式过滤 docker logs container_name | grep -E "(started|stopped|error)" # 统计错误数量 docker logs container_name | grep "ERROR" | wc -l
# 提取时间戳和日志级别
docker logs container_name | awk '{print $1, $2, $4}'
# 统计不同级别的日志数量
docker logs container_name | awk '{print $4}' | sort | uniq -c
# 提取特定时间段的日志
docker logs container_name | awk '/2024-01-15 10:/{print}'
# 实时监控错误日志 docker logs -f container_name | grep --line-buffered "ERROR" # 实时监控并高亮显示 docker logs -f container_name | grep --color=always -E "(ERROR|WARN|SUCCESS)" # 使用 multitail 监控多个容器(需要安装 multitail) multitail -cS docker -l "docker logs -f container1" -l "docker logs -f container2"
monitor-logs.sh
#!/bin/bash
# 日志监控脚本
CONTAINER_NAME=$1
KEYWORD=${2:-"ERROR"}
TAIL_LINES=${3:-100}
if [ -z "$CONTAINER_NAME" ]; then
echo "Usage: $0 <container_name> [keyword] [tail_lines]"
echo "Example: $0 my-app ERROR 50"
exit 1
fi
echo "=== Monitoring logs for container: $CONTAINER_NAME ==="
echo "Keyword: $KEYWORD"
echo "Showing last $TAIL_LINES lines, then following..."
echo "Press Ctrl+C to stop"
echo ""
# 显示最近的日志并实时跟踪
docker logs --tail=$TAIL_LINES -f "$CONTAINER_NAME" | grep --line-buffered -E "(.*$KEYWORD.*|$)" --color=always
使用方法:
chmod +x monitor-logs.sh # 监控错误日志 ./monitor-logs.sh node-app ERROR # 监控特定关键词 ./monitor-logs.sh nginx-test " 404 " # 显示最近200行并监控 ./monitor-logs.sh python-app INFO 200
multi-logs.sh
#!/bin/bash
# 多容器日志聚合脚本
show_usage() {
echo "Usage: $0 [options] [containers...]"
echo "Options:"
echo " -f, --follow Follow logs (like tail -f)"
echo " -t, --timestamp Show timestamps"
echo " -n, --lines N Number of lines to show (default: 50)"
echo " -h, --help Show this help"
echo ""
echo "Examples:"
echo " $0 web api db # Show recent logs for multiple containers"
echo " $0 -f web api # Follow logs for web and api containers"
echo " $0 -ftn 100 web # Follow with timestamp, 100 lines"
}
FOLLOW=false
SHOW_TIMESTAMP=false
LINES=50
CONTAINERS=()
while [[ $# -gt 0 ]]; do
case $1 in
-f|--follow)
FOLLOW=true
shift
;;
-t|--timestamp)
SHOW_TIMESTAMP=true
shift
;;
-n|--lines)
LINES="$2"
shift 2
;;
-h|--help)
show_usage
exit 0
;;
*)
CONTAINERS+=("$1")
shift
;;
esac
done
# 如果没有指定容器,显示所有运行中的容器
if [ ${#CONTAINERS[@]} -eq 0 ]; then
mapfile -t CONTAINERS < <(docker ps --format "{{.Names}}")
fi
# 构建命令
CMD="docker logs"
if [ "$FOLLOW" = true ]; then
CMD="$CMD -f"
fi
if [ "$SHOW_TIMESTAMP" = true ]; then
CMD="$CMD -t"
fi
CMD="$CMD --tail=$LINES"
echo "=== Multi-container Log Monitor ==="
echo "Containers: ${CONTAINERS[*]}"
echo "Command: $CMD"
echo "Press Ctrl+C to stop"
echo ""
# 为每个容器执行日志命令
for container in "${CONTAINERS[@]}"; do
echo "--- Logs for $container ---"
$CMD "$container"
echo ""
done
# 如果设置了 follow,持续监控
if [ "$FOLLOW" = true ]; then
echo "Following logs... Press Ctrl+C to stop"
trap 'echo "Stopping log monitor..."; exit 0' INT
while true; do
for container in "${CONTAINERS[@]}"; do
# 使用 docker logs -f 会阻塞,所以这里我们用一个简单的方法
# 在实际使用中,可以考虑使用 multitail 或其他工具
sleep 1
done
done
fi
| 需求 | 命令 | 说明 | |
|---|---|---|---|
查看实时日志 |
docker logs -f container |
类似 tail -f |
|
查看带时间戳的日志 |
docker logs -ft container |
显示时间戳 |
|
查看最近N行 |
docker logs —tail=100 container |
显示最后100行 |
|
查看时间段日志 |
docker logs —since 1h container |
查看1小时内的日志 |
|
Compose 多容器日志 |
docker-compose logs -f |
跟踪所有服务日志 |
|
过滤错误日志 |
docker logs container \ |
grep ERROR |
过滤错误信息 |
结构化日志美化 |
docker logs container \ |
jq . |
需要 jq 工具 |