Shell脚本如何查看容器标准输出

wen 实用脚本 3

本文目录导读:

Shell脚本如何查看容器标准输出

  1. 使用 docker logs 命令
  2. 输出重定向到文件
  3. 使用 docker attach 命令
  4. 使用 docker exec 结合 cat 命令
  5. 完整的脚本示例
  6. 格式化输出
  7. 处理多个容器
  8. 注意事项

在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

注意事项

  1. 权限问题:确保脚本有足够的权限访问Docker socket
  2. 资源消耗-f 模式会持续监听,注意资源占用
  3. 日志轮转:Docker默认开启日志轮转,避免日志文件过大
  4. 编码问题:确保终端编码与容器日志编码一致

选择哪种方法取决于具体需求:

  • 实时监控:使用 docker logs -f
  • 调试问题:使用 --tail--since
  • 日志归档:重定向到文件

抱歉,评论功能暂时关闭!