本文目录导读:

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版本使用。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播