Shell脚本如何配置容器日志查询

wen 实用脚本 1

本文目录导读:

Shell脚本如何配置容器日志查询

  1. Docker容器日志查询脚本
  2. Kubernetes Pod日志查询脚本
  3. 配置文件 (config.sh)
  4. 使用示例
  5. 定时任务配置

Docker容器日志查询脚本

#!/bin/bash
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # 无颜色
# 默认配置
DEFAULT_SINCE="5m"
DEFAULT_TAIL=100
LOG_DIR="/var/log/docker-containers"
# 创建日志目录
mkdir -p "$LOG_DIR"
# 显示帮助
show_help() {
    cat << EOF
容器日志查询脚本
用法: $0 [选项]
选项:
  -c, --container    容器名称或ID
  -n, --name         通过名称搜索容器
  -s, --since        时间范围 (如: 5m, 1h, "2023-01-01")
  -t, --tail         显示最后N行
  -f, --follow       跟踪日志输出
  -o, --output       输出到文件
  -p, --pattern      搜索关键词
  -l, --list         列出所有容器
  -h, --help         显示帮助信息
示例:
  $0 -l                           # 列出所有容器
  $0 -c nginx -s 1h              # 查看nginx最近1小时日志
  $0 -c myapp -t 200 -p "ERROR"  # 查看最近200行包含ERROR的日志
  $0 -c web -f                   # 实时跟踪web容器的日志
EOF
}
# 列出所有容器
list_containers() {
    echo -e "${BLUE}正在运行的容器:${NC}"
    docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}"
    echo -e "\n${YELLOW}所有容器:${NC}"
    docker ps -a --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}"
}
# 查询容器日志
query_logs() {
    local container="$1"
    local since="$2"
    local tail="$3"
    local follow="$4"
    local output="$5"
    local pattern="$6"
    # 检查容器是否存在
    if ! docker ps -a --format "{{.Names}}" | grep -q "^${container}$"; then
        echo -e "${RED}错误: 容器 '$container' 不存在${NC}"
        return 1
    fi
    # 构建docker logs命令
    local cmd="docker logs"
    [[ -n "$since" ]] && cmd+=" --since $since"
    [[ -n "$tail" ]] && cmd+=" --tail $tail"
    [[ "$follow" == "true" ]] && cmd+=" --follow"
    cmd+=" $container"
    echo -e "${GREEN}正在查询容器 '$container' 的日志...${NC}"
    echo -e "${YELLOW}时间范围: ${since:-默认5分钟} | 行数: ${tail:-全部}${NC}\n"
    # 执行查询
    if [[ -n "$pattern" ]]; then
        # 带关键词过滤
        if [[ -n "$output" ]]; then
            $cmd 2>&1 | grep -i "$pattern" > "$output"
            echo -e "${GREEN}日志已保存到: $output${NC}"
        else
            $cmd 2>&1 | grep -i --color=always "$pattern"
        fi
    else
        if [[ -n "$output" ]]; then
            $cmd > "$output" 2>&1
            echo -e "${GREEN}日志已保存到: $output${NC}"
        else
            $cmd
        fi
    fi
}
# 解析命令行参数
CONTAINER=""
SINCE="$DEFAULT_SINCE"
TAIL="$DEFAULT_TAIL"
FOLLOW="false"
OUTPUT=""
PATTERN=""
while [[ $# -gt 0 ]]; do
    case $1 in
        -l|--list)
            list_containers
            exit 0
            ;;
        -c|--container)
            CONTAINER="$2"
            shift 2
            ;;
        -n|--name)
            CONTAINER=$(docker ps --format "{{.Names}}" | grep "$2" | head -n 1)
            if [[ -z "$CONTAINER" ]]; then
                echo -e "${RED}未找到包含 '$2' 的容器${NC}"
                exit 1
            fi
            shift 2
            ;;
        -s|--since)
            SINCE="$2"
            shift 2
            ;;
        -t|--tail)
            TAIL="$2"
            shift 2
            ;;
        -f|--follow)
            FOLLOW="true"
            shift
            ;;
        -o|--output)
            OUTPUT="$2"
            shift 2
            ;;
        -p|--pattern)
            PATTERN="$2"
            shift 2
            ;;
        -h|--help)
            show_help
            exit 0
            ;;
        *)
            echo -e "${RED}未知选项: $1${NC}"
            show_help
            exit 1
            ;;
    esac
done
# 执行主逻辑
if [[ -n "$CONTAINER" ]]; then
    query_logs "$CONTAINER" "$SINCE" "$TAIL" "$FOLLOW" "$OUTPUT" "$PATTERN"
else
    echo -e "${RED}请指定容器名称或ID${NC}"
    show_help
    exit 1
fi

Kubernetes Pod日志查询脚本

#!/bin/bash
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# 默认配置
DEFAULT_NAMESPACE="default"
DEFAULT_SINCE="5m"
DEFAULT_TAIL=100
LOG_DIR="/var/log/k8s-pods"
# 创建日志目录
mkdir -p "$LOG_DIR"
# 显示帮助
show_help() {
    cat << EOF
Kubernetes Pod日志查询脚本
用法: $0 [选项]
选项:
  -p, --pod           Pod名称
  -n, --namespace     Namespace (默认: default)
  -c, --container     容器名称 (多容器Pod时必需)
  -l, --label         按标签选择器查询
  -s, --since         时间范围
  -t, --tail          显示最后N行
  -f, --follow        跟踪日志输出
  -o, --output        输出到文件
  -g, --grep          搜索关键词
  --all-namespaces    查询所有namespaces
  -h, --help          显示帮助
示例:
  $0 -p my-pod                    # 查看Pod日志
  $0 -l app=nginx -n production   # 查看production命名空间下app=nginx的Pod
  $0 -p my-pod -c sidecar -t 200  # 查看sidecar容器最近200行日志
  $0 -p my-pod -f -g "ERROR"      # 实时监控ERROR日志
EOF
}
# 获取Pod列表
get_pods() {
    local namespace="$1"
    local label="$2"
    local all_ns="$3"
    if [[ "$all_ns" == "true" ]]; then
        if [[ -n "$label" ]]; then
            kubectl get pods --all-namespaces -l "$label" --field-selector status.phase=Running
        else
            kubectl get pods --all-namespaces
        fi
    else
        if [[ -n "$label" ]]; then
            kubectl get pods -n "$namespace" -l "$label" --field-selector status.phase=Running
        else
            kubectl get pods -n "$namespace"
        fi
    fi
}
# 查询Pod日志
query_pod_logs() {
    local pod="$1"
    local namespace="$2"
    local container="$3"
    local since="$4"
    local tail="$5"
    local follow="$6"
    local output="$7"
    local pattern="$8"
    # 检查Pod是否存在
    if ! kubectl get pod "$pod" -n "$namespace" &>/dev/null; then
        echo -e "${RED}错误: Pod '$pod' 在 namespace '$namespace' 中不存在${NC}"
        return 1
    fi
    # 构建kubectl logs命令
    local cmd="kubectl logs $pod -n $namespace"
    [[ -n "$container" ]] && cmd+=" -c $container"
    [[ -n "$since" ]] && cmd+=" --since=$since"
    [[ -n "$tail" ]] && cmd+=" --tail=$tail"
    [[ "$follow" == "true" ]] && cmd+=" --follow"
    echo -e "${GREEN}正在查询 Pod '$pod' 的日志...${NC}"
    echo -e "${YELLOW}Namespace: $namespace | 容器: ${container:-默认} | 时间: ${since:-5m} | 行数: ${tail:-全部}${NC}\n"
    # 执行查询
    if [[ -n "$pattern" ]]; then
        if [[ -n "$output" ]]; then
            $cmd 2>&1 | grep -i "$pattern" > "$output"
            echo -e "${GREEN}日志已保存到: $output${NC}"
        else
            $cmd 2>&1 | grep -i --color=always "$pattern"
        fi
    else
        if [[ -n "$output" ]]; then
            $cmd > "$output" 2>&1
            echo -e "${GREEN}日志已保存到: $output${NC}"
        else
            $cmd
        fi
    fi
}
# 高级查询功能
advanced_query() {
    local namespace="$1"
    local label="$2"
    local container="$3"
    local since="$4"
    local tail="$5"
    local pattern="$6"
    # 获取匹配的Pods
    local pods=($(kubectl get pods -n "$namespace" -l "$label" -o jsonpath='{.items[*].metadata.name}'))
    if [[ ${#pods[@]} -eq 0 ]]; then
        echo -e "${RED}未找到匹配的Pod${NC}"
        return 1
    fi
    echo -e "${GREEN}找到 ${#pods[@]} 个匹配的Pod:${NC}"
    printf '%s\n' "${pods[@]}"
    # 遍历所有匹配的Pod
    for pod in "${pods[@]}"; do
        echo -e "\n${BLUE}=== Pod: $pod ===${NC}"
        query_pod_logs "$pod" "$namespace" "$container" "$since" "$tail" "false" "" "$pattern"
    done
}
# 解析命令行参数
POD=""
NAMESPACE="$DEFAULT_NAMESPACE"
CONTAINER=""
LABEL=""
SINCE="$DEFAULT_SINCE"
TAIL="$DEFAULT_TAIL"
FOLLOW="false"
OUTPUT=""
PATTERN=""
ALL_NS="false"
while [[ $# -gt 0 ]]; do
    case $1 in
        -p|--pod)
            POD="$2"
            shift 2
            ;;
        -n|--namespace)
            NAMESPACE="$2"
            shift 2
            ;;
        -c|--container)
            CONTAINER="$2"
            shift 2
            ;;
        -l|--label)
            LABEL="$2"
            shift 2
            ;;
        -s|--since)
            SINCE="$2"
            shift 2
            ;;
        -t|--tail)
            TAIL="$2"
            shift 2
            ;;
        -f|--follow)
            FOLLOW="true"
            shift
            ;;
        -o|--output)
            OUTPUT="$2"
            shift 2
            ;;
        -g|--grep)
            PATTERN="$2"
            shift 2
            ;;
        --all-namespaces)
            ALL_NS="true"
            NAMESPACE=""
            shift
            ;;
        -h|--help)
            show_help
            exit 0
            ;;
        *)
            echo -e "${RED}未知选项: $1${NC}"
            show_help
            exit 1
            ;;
    esac
done
# 主逻辑
if [[ -n "$POD" ]]; then
    # 查询特定Pod
    query_pod_logs "$POD" "$NAMESPACE" "$CONTAINER" "$SINCE" "$TAIL" "$FOLLOW" "$OUTPUT" "$PATTERN"
elif [[ -n "$LABEL" ]]; then
    # 按标签查询
    advanced_query "$NAMESPACE" "$LABEL" "$CONTAINER" "$SINCE" "$TAIL" "$PATTERN"
else
    # 列出Pods
    get_pods "$NAMESPACE" "" "$ALL_NS"
fi

配置文件 (config.sh)

#!/bin/bash
# 通用配置
DEFAULT_TIMEZONE="Asia/Shanghai"
LOG_RETENTION_DAYS=30
MAX_LOG_FILE_SIZE="100M"
# 邮件告警配置 (可选)
SMTP_SERVER="smtp.example.com"
SMTP_PORT=25
SMTP_USER="your-email@example.com"
SMTP_PASS="your-password"
ALERT_EMAIL="admin@example.com"
# 日志关键词监控
KEYWORDS_MONITOR=("ERROR" "FATAL" "CRITICAL" "OOM" "OutOfMemory")
# 自定义日志格式
LOG_FORMAT="json"  # 支持: json, raw, pretty
# 告警阈值
ERROR_THRESHOLD=10  # 单位时间内错误次数阈值
ALERT_INTERVAL=300  # 告警间隔(秒)

使用示例

# 保存脚本为文件
chmod +x docker_logs.sh k8s_logs.sh
# Docker日志查询
./docker_logs.sh -l                    # 列出容器
./docker_logs.sh -c nginx -s 1h        # 查看最近1小时日志
./docker_logs.sh -c myapp -p "ERROR"   # 搜索ERROR关键词
# Kubernetes日志查询
./k8s_logs.sh -n production            # 查看production命名空间
./k8s_logs.sh -p my-pod -f             # 实时跟踪Pod日志
./k8s_logs.sh -l app=nginx -g "500"    # 查询包含500的日志

定时任务配置

# crontab配置示例
# 每天凌晨2点清理7天前的日志
0 2 * * * /path/to/log_cleanup.sh 7
# 每5分钟检查一次ERROR日志
*/5 * * * * /path/to/check_errors.sh

这些脚本提供了完整的容器日志查询功能,支持过滤、搜索、实时追踪和输出保存等特性,根据实际环境选择Docker或Kubernetes版本使用。

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