如何写查看容器运行日志脚本

wen 实用脚本 36

本文目录导读:

如何写查看容器运行日志脚本

  1. 基础版 - 查看单个容器日志
  2. 增强版 - 带多选项的日志查看
  3. 高级版 - 交互式日志查看器
  4. Docker Compose 日志查看脚本
  5. 使用说明

我来帮你编写一个查看容器运行日志的脚本,以下是几种不同场景的脚本方案:

基础版 - 查看单个容器日志

#!/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

这些脚本提供了不同层次的日志查看功能,你可以根据实际需求选择合适的版本。

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