本文目录导读:

我来帮你编写一个查看容器运行日志的脚本,以下是几种不同场景的脚本方案:
基础版 - 查看单个容器日志
#!/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
这些脚本提供了不同层次的日志查看功能,你可以根据实际需求选择合适的版本。
版权声明: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直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播