根据docker服务保存日志脚本,时间可选版本

bash 复制代码
#!/bin/bash

# 获取docker ps输出,提取容器ID和名称,并存入数组
container_ids=($(docker ps -q))
container_names=($(docker ps --format '{{.Names}}'))

# 检查是否有运行中的容器
if [ ${#container_ids[@]} -eq 0 ]; then
    echo "No running containers found."
    exit 1
fi

# 显示容器列表供用户选择
echo "Running containers:"
for i in "${!container_ids[@]}"; do
    echo "[$i] ${container_names[$i]} (${container_ids[$i]})"
done

# 请求用户选择容器
read -p "Enter the index of the container to view logs: " choice

# 验证用户输入是否为有效数字
re='^[0-9]+$'
if ! [[ $choice =~ $re ]]; then
   echo "Error: Invalid input, please enter a number."
   exit 1
fi

# 验证用户选择是否在范围内
if (( choice < 0 || choice >= ${#container_ids[@]} )); then
    echo "Error: Index out of range."
    exit 1
fi

# 获取用户选择的容器ID和名称
selected_container_id="${container_ids[$choice]}"
selected_container_name="${container_names[$choice]}"

# 功能选择菜单
echo ""
echo "Select an option:"
echo "[1] View logs in terminal"
echo "[2] Save logs to file"
read -p "Enter your choice (1 or 2): " option

case $option in
    1)
        # 查看日志功能
        read -p "Enter the number of lines to display (default is 1000): " lines
        lines=${lines:-1000}

        read -p "Enter a keyword to search for in the logs (leave empty for no search): " keyword

        if [ -z "$keyword" ]; then
            docker logs -f --tail "$lines" "$selected_container_id"
        else
            docker logs -f --tail "$lines" "$selected_container_id" | grep "$keyword"
        fi
        ;;
    2)
        # 保存日志功能
        echo ""
        echo "Save log options:"
        echo "[1] Last 2 days (default)"
        echo "[2] Last 24 hours"
        echo "[3] Last 7 days"
        echo "[4] Custom hours"
        echo "[5] All logs (since container start)"
        read -p "Enter your choice (1-5): " time_option

        case $time_option in
            1|"")
                # 最近2天 = 48小时
                since_time="48h"
                since_display="2 days (48 hours)"
                ;;
            2)
                since_time="24h"
                since_display="24 hours"
                ;;
            3)
                since_time="168h"
                since_display="7 days (168 hours)"
                ;;
            4)
                read -p "Enter number of hours: " custom_hours
                since_time="${custom_hours}h"
                since_display="${custom_hours} hours"
                ;;
            5)
                since_time=""
                since_display="all logs (since container start)"
                ;;
            *)
                echo "Invalid option, using default (2 days)"
                since_time="48h"
                since_display="2 days (48 hours)"
                ;;
        esac

        # 生成文件名
        timestamp=$(date +"%Y%m%d_%H%M%S")
        filename="${selected_container_name}_logs_${timestamp}.log"
        
        echo "Saving logs for container: $selected_container_name"
        echo "Time range: $since_display"
        echo "File: $filename"
        echo ""

        # 保存日志(根据是否指定时间范围使用不同的命令)
        if [ -z "$since_time" ]; then
            docker logs "$selected_container_id" > "$filename"
        else
            docker logs --since "$since_time" "$selected_container_id" > "$filename"
        fi
        
        if [ $? -eq 0 ]; then
            echo "Logs successfully saved to: $filename"
            echo "File size: $(du -h "$filename" | cut -f1)"
            echo "Lines saved: $(wc -l < "$filename")"
        else
            echo "Error: Failed to save logs"
            # 清理可能创建的空文件
            if [ -f "$filename" ] && [ ! -s "$filename" ]; then
                rm "$filename"
            fi
            exit 1
        fi
        ;;
    *)
        echo "Invalid option selected"
        exit 1
        ;;
esac

正确的时间格式:Docker logs 的 --since 参数支持以下格式:

10m - 10分钟

2h - 2小时

30h - 30小时

2007-01-02T15:04:05 - 具体时间戳

提供多个预设选项:

2天 = 48小时

24小时

7天 = 168小时

自定义小时数

所有日志

更好的错误处理:如果保存失败,会清理空文件

Docker logs --since 支持的格式:

10m - 10分钟前到现在

1h30m - 1小时30分钟前到现在

2h - 2小时前到现在

2013-01-02T13:23:37 - 从特定时间点开始

现在脚本应该能正常工作,不会出现时间格式错误了!

相关推荐
分布式存储与RustFS11 分钟前
模型 checkpoint 放对象存储:分片上传、断点续传与残留清理
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
一条破秋裤1 小时前
Linux 线程创建:pthread_create 与基本回收
java·linux·运维
FED_AF3 小时前
Linux运维“邪修”功法之通配符
linux·运维
YOLO数据集集合4 小时前
风机叶片表面损伤检测数据集 | 风机叶片 表面损伤 污渍检测 无人机巡检 风电运维9119期
运维·人工智能·计算机视觉·目标跟踪·无人机·智慧城市·电力巡检
j7~4 小时前
【Linux网络编程】四十七.《Linux IO 模型详解:阻塞 IO、非阻塞 IO 与 IO 多路转接(select)》
linux·运维·网络·select·非阻塞io·阻塞io·i/o多路连接
分布式存储与RustFS4 小时前
用RustFS给Harbor当S3存储后端
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
泡海椒5 小时前
趋势分析报表:jquick-pdf折线图PDF生成实战
java·大数据·运维·服务器·前端·pdf
vipxieliang5 小时前
Docker vs Podman vs containerd:容器运行时全景
docker·容器
vipxieliang5 小时前
数据持久化方案:卷、挂载、权限与备份恢复
docker·容器
丸子君君5 小时前
【以麒麟服务器时间为准,定时请求时间同步】
运维·服务器·单片机