本文目录导读:

我来帮你编写一个查看容器运行日志的脚本,以下是几种不同场景的脚本方案:
基础版 - 查看单个容器日志
#!/bin/bash
# 容器日志查看脚本
# 使用方式:./view_logs.sh <容器名称或ID>
# 检查参数
if [ $# -eq 0 ]; then
echo "使用方法: $0 <容器名称或ID>"
echo " $0 my_container"
exit 1
fi
CONTAINER=$1
# 检查容器是否存在
if ! docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER}$"; then
echo "错误: 容器 '$CONTAINER' 不存在"
echo "可用的容器:"
docker ps -a --format '{{.Names}}'
exit 1
fi
# 查看容器日志
echo "正在查看容器 '$CONTAINER' 的日志..."
docker logs --tail 100 -f $CONTAINER
增强版 - 带多选项的日志查看
#!/bin/bash
# 增强版容器日志查看脚本
# 使用方式:./view_logs.sh [选项] <容器名称或ID>
show_usage() {
echo "使用方法: $0 [选项] <容器名称或ID>"
echo "选项:"
echo " -t, --tail NUM 显示最后NUM行 (默认: 100)"
echo " -s, --since TIME 显示指定时间后的日志 ( '5m', '1h')"
echo " -f, --follow 持续跟踪日志"
echo " -l, --list 显示所有运行中的容器"
echo " -h, --help 显示帮助信息"
echo ""
echo "示例:"
echo " $0 my_container # 查看最后100行日志"
echo " $0 -t 50 my_container # 查看最后50行日志"
echo " $0 -s 5m my_container # 查看过去5分钟的日志"
echo " $0 -f my_container # 持续跟踪日志"
echo " $0 -l # 列出所有容器"
}
# 默认值
TAIL_LINES=100
FOLLOW=false
SINCE=""
# 如果无参数,显示帮助
if [ $# -eq 0 ]; then
show_usage
exit 0
fi
# 解析参数
while [[ $# -gt 0 ]]; do
case "$1" in
-h|--help)
show_usage
exit 0
;;
-l|--list)
echo "所有运行中的容器:"
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Image}}"
exit 0
;;
-t|--tail)
TAIL_LINES="$2"
shift 2
;;
-s|--since)
SINCE="--since $2"
shift 2
;;
-f|--follow)
FOLLOW=true
shift
;;
*)
CONTAINER="$1"
shift
;;
esac
done
# 检查容器名称是否提供
if [ -z "$CONTAINER" ]; then
echo "错误: 请提供容器名称或ID"
show_usage
exit 1
fi
# 检查容器是否存在
if ! docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER}$"; then
echo "错误: 容器 '$CONTAINER' 不存在"
echo ""
echo "所有容器:"
docker ps -a --format 'table {{.Names}}\t{{.Status}}\t{{.Image}}'
exit 1
fi
# 检查容器是否在运行
if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER}$"; then
echo "警告: 容器 '$CONTAINER' 当前未运行"
echo "将显示历史日志..."
fi
# 构建命令
CMD="docker logs"
[ -n "$TAIL_LINES" ] && CMD="$CMD --tail $TAIL_LINES"
[ -n "$SINCE" ] && CMD="$CMD $SINCE"
[ "$FOLLOW" = true ] && CMD="$CMD -f"
CMD="$CMD $CONTAINER"
# 执行命令
echo "执行: $CMD"
echo "==========================================="
eval $CMD
高级版 - 交互式日志查看器
#!/bin/bash
# 交互式容器日志查看器
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 日志级别颜色
declare -A LEVEL_COLORS
LEVEL_COLORS=(
["ERROR"]="${RED}"
["WARN"]="${YELLOW}"
["INFO"]="${GREEN}"
["DEBUG"]="${BLUE}"
)
cleanup() {
echo -e "\n${YELLOW}正在退出日志查看器...${NC}"
exit 0
}
trap cleanup SIGINT SIGTERM
# 获取所有容器
get_containers() {
docker ps --format '{{.Names}}' | sort
}
# 显示容器列表
show_container_list() {
echo -e "${BLUE}运行中的容器:${NC}"
local containers=($(get_containers))
if [ ${#containers[@]} -eq 0 ]; then
echo -e "${RED}没有运行中的容器${NC}"
exit 1
fi
for i in "${!containers[@]}"; do
echo "$((i+1)). ${containers[$i]}"
done
}
# 选择容器
select_container() {
local containers=($(get_containers))
if [ ${#containers[@]} -eq 0 ]; then
echo -e "${RED}没有运行中的容器${NC}"
exit 1
fi
if [ ${#containers[@]} -eq 1 ]; then
echo "${containers[0]}"
return
fi
show_container_list
echo ""
read -p "请选择容器 (1-${#containers[@]}): " choice
if [[ ! "$choice" =~ ^[0-9]+$ ]] || [ "$choice" -lt 1 ] || [ "$choice" -gt ${#containers[@]} ]; then
echo -e "${RED}无效选择${NC}"
exit 1
fi
echo "${containers[$((choice-1))]}"
}
# 选择查看模式
select_mode() {
echo ""
echo -e "${BLUE}选择查看模式:${NC}"
echo "1. 查看最后N行日志"
echo "2. 查看最近时间日志 ( 5m, 1h)"
echo "3. 持续跟踪日志"
echo "4. 实时监控 (带时间戳)"
echo "5. 导出日志到文件"
echo ""
read -p "请选择 (1-5): " mode
echo "$mode"
}
# 带颜色的日志输出
colorize_log() {
local line="$1"
for level in "${!LEVEL_COLORS[@]}"; do
if echo "$line" | grep -qi "$level"; then
echo -e "${LEVEL_COLORS[$level]}$line${NC}"
return
fi
done
echo "$line"
}
# 主逻辑
main() {
local container
# 如果提供了容器名称参数
if [ $# -gt 0 ]; then
container="$1"
else
# 交互选择容器
container=$(select_container)
fi
# 选择查看模式
mode=$(select_mode)
case $mode in
1)
read -p "查看最后多少行? (默认: 100): " lines
lines=${lines:-100}
echo -e "${GREEN}查看容器 '$container' 的最后 $lines 行日志:${NC}"
docker logs --tail "$lines" "$container" | while read line; do
colorize_log "$line"
done
;;
2)
read -p "查看最近多长时间? ( 5m, 1h): " since
echo -e "${GREEN}查看容器 '$container' 过去 $since 的日志:${NC}"
docker logs --since "$since" "$container" | while read line; do
colorize_log "$line"
done
;;
3)
echo -e "${GREEN}持续跟踪容器 '$container' 的日志 (按 Ctrl+C 退出):${NC}"
docker logs -f "$container" | while read line; do
colorize_log "$line"
done
;;
4)
echo -e "${GREEN}实时监控容器 '$container' 的日志 (按 Ctrl+C 退出):${NC}"
docker logs -f --tail 0 -t "$container" | while read line; do
timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo -e "${YELLOW}[$timestamp]${NC} $line"
done
;;
5)
log_file="container_${container}_$(date '+%Y%m%d_%H%M%S').log"
echo -e "${GREEN}正在导出容器 '$container' 的日志到 $log_file ...${NC}"
docker logs "$container" > "$log_file"
echo -e "${GREEN}日志已导出到: $log_file${NC}"
echo -e "${YELLOW}文件大小: $(ls -lh "$log_file" | awk '{print $5}')${NC}"
;;
*)
echo -e "${RED}无效选择${NC}"
exit 1
;;
esac
}
# 运行主程序
main "$@"
Docker Compose 日志查看脚本
#!/bin/bash
# Docker Compose 项目日志查看脚本
# 使用方式:./view_compose_logs.sh [项目目录] [服务名]
show_usage() {
echo "使用方法: $0 [选项] [项目目录] [服务名]"
echo ""
echo "选项:"
echo " -f, --follow 持续跟踪日志"
echo " -t, --tail NUM 显示最后NUM行"
echo " --help 显示帮助信息"
echo ""
echo "示例:"
echo " $0 # 查看当前目录compose项目日志"
echo " $0 /path/to/project # 查看指定目录compose项目日志"
echo " $0 -f /path/to/project # 持续跟踪日志"
echo " $0 . web # 查看web服务的日志"
}
# 解析参数
FOLLOW=false
TAIL=""
PROJECT_DIR=""
SERVICE=""
while [[ $# -gt 0 ]]; do
case "$1" in
-f|--follow)
FOLLOW=true
shift
;;
-t|--tail)
TAIL="--tail $2"
shift 2
;;
--help)
show_usage
exit 0
;;
*)
if [ -z "$PROJECT_DIR" ]; then
PROJECT_DIR="$1"
elif [ -z "$SERVICE" ]; then
SERVICE="$1"
fi
shift
;;
esac
done
# 使用当前目录作为默认项目目录
PROJECT_DIR=${PROJECT_DIR:-.}
# 检查docker-compose.yml是否存在
if [ ! -f "$PROJECT_DIR/docker-compose.yml" ] && [ ! -f "$PROJECT_DIR/docker-compose.yaml" ]; then
echo "错误: 在 '$PROJECT_DIR' 中找不到 docker-compose.yml 文件"
exit 1
fi
# 进入项目目录
cd "$PROJECT_DIR"
# 构建命令
CMD="docker-compose logs"
[ "$FOLLOW" = true ] && CMD="$CMD -f"
[ -n "$TAIL" ] && CMD="$CMD $TAIL"
[ -n "$SERVICE" ] && CMD="$CMD $SERVICE"
# 执行命令
echo "执行: $CMD"
echo "==========================================="
eval $CMD
使用说明
安装和授权
# 给脚本添加执行权限 chmod +x view_logs.sh chmod +x view_logs_advanced.sh chmod +x view_logs_interactive.sh # 移动到系统路径(可选) sudo cp view_logs.sh /usr/local/bin/docker-logs sudo cp view_logs_advanced.sh /usr/local/bin/docker-logs-advanced sudo cp view_logs_interactive.sh /usr/local/bin/docker-logs-interactive
使用示例
# 基础用法 ./view_logs.sh my_container # 增强版用法 ./view_logs_advanced.sh -t 50 -f my_container ./view_logs_advanced.sh -s 5m my_container ./view_logs_advanced.sh -l # 列出容器 # 交互式用法 ./view_logs_interactive.sh ./view_logs_interactive.sh my_container # Docker Compose 日志 ./view_compose_logs.sh /path/to/project ./view_compose_logs.sh -f . web
这些脚本提供了不同层次的日志查看功能,你可以根据实际需求选择合适的版本。