本文目录导读:

在Shell脚本中查看容器的标准输出,主要有以下几种方法:
使用 docker logs 命令
查看实时日志
#!/bin/bash # 查看容器实时标准输出 docker logs -f container_name # 或使用容器ID docker logs -f container_id
查看最近的N行
#!/bin/bash # 查看最后100行 docker logs --tail 100 container_name # 查看最后100行并持续跟踪 docker logs --tail 100 -f container_name
查看特定时间范围的日志
#!/bin/bash # 查看最近5分钟的日志 docker logs --since 5m container_name # 查看特定时间段的日志 docker logs --since "2024-01-01T00:00:00" --until "2024-01-02T00:00:00" container_name # 查看最新30秒的日志 docker logs --since 30s container_name
输出重定向到文件
#!/bin/bash # 将容器日志保存到文件 docker logs container_name > /var/log/container.log 2>&1 # 追加日志到文件 docker logs container_name >> /var/log/container.log 2>&1 # 将日志同时输出到文件和终端 docker logs container_name | tee -a /var/log/container.log
使用 docker attach 命令
#!/bin/bash # 连接到容器标准输出(注意:会阻塞脚本) docker attach container_name # 使用选项避免干扰容器运行 docker attach --no-stdin container_name
使用 docker exec 结合 cat 命令
#!/bin/bash # 查看容器内的日志文件 docker exec container_name cat /var/log/app.log # 实时查看容器内日志 docker exec -t container_name tail -f /var/log/app.log
完整的脚本示例
#!/bin/bash
CONTAINER_NAME="myapp"
LOG_FILE="/var/log/myapp.log"
# 检查容器是否运行
if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
echo "错误: 容器 $CONTAINER_NAME 未运行"
exit 1
fi
# 查看容器日志并保存
echo "=== 容器标准输出 ==="
echo "时间: $(date)"
echo "-------------------"
# 方法1:直接查看实时日志
docker logs --tail 50 -f $CONTAINER_NAME &
# 方法2:保存到文件
docker logs $CONTAINER_NAME > $LOG_FILE 2>&1
echo "日志已保存到: $LOG_FILE"
# 方法3:带时间戳查看
docker logs --timestamps $CONTAINER_NAME
# 等待后台进程
wait
格式化输出
#!/bin/bash
# 格式化显示日志
docker logs --timestamps $CONTAINER_NAME | while read line; do
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $line"
done
# 仅显示特定关键词的日志
docker logs $CONTAINER_NAME | grep -i "error\|warning"
处理多个容器
#!/bin/bash
# 查看多个容器的日志
containers=("web-app" "api-service" "database")
for container in "${containers[@]}"; do
echo "=== $container 日志 ==="
docker logs --tail 20 $container 2>/dev/null || echo "容器不存在或未运行"
echo ""
done
注意事项
- 权限问题:确保脚本有足够的权限访问Docker socket
- 资源消耗:
-f模式会持续监听,注意资源占用 - 日志轮转:Docker默认开启日志轮转,避免日志文件过大
- 编码问题:确保终端编码与容器日志编码一致
选择哪种方法取决于具体需求:
- 实时监控:使用
docker logs -f - 调试问题:使用
--tail和--since - 日志归档:重定向到文件