本文目录导读:

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版本使用。