o2o-negosium-original/logs.sh

70 lines
1.8 KiB
Bash
Executable File

#!/usr/bin/env bash
# 운영 로그 보기 — 실행하면 실행중인 컨테이너 번호 메뉴, 0=전체
# ./logs.sh → 메뉴에서 선택
# ./logs.sh 3 → 메뉴 안 띄우고 3번 바로
# ./logs.sh lps-api → 이름으로 바로
set -e
TAIL=100
# 우리 프로젝트 컨테이너만 (negosium-db는 compose 라벨이 없어 이름으로 포함)
containers=()
while IFS= read -r name; do
containers+=("$name")
done < <(
{
docker ps --filter label=com.docker.compose.project=o2o-negosium --format '{{.Names}}'
docker ps --filter name='^negosium-db$' --format '{{.Names}}'
} | sort -u
)
if [ ${#containers[@]} -eq 0 ]; then
echo "실행 중인 컨테이너가 없습니다."
exit 1
fi
follow_all() {
# docker logs -f 는 컨테이너 하나씩만 되므로 백그라운드로 전부 띄우고 prefix 붙임
trap 'kill $(jobs -p) 2>/dev/null; exit 0' INT TERM
local colors=(31 32 33 34 35 36 91 92 93 94 95 96)
local i=0
for c in "${containers[@]}"; do
local col=${colors[$((i % ${#colors[@]}))]}
docker logs -f --tail "$TAIL" "$c" 2>&1 | sed -u "s/^/$(printf '\033[%sm[%s]\033[0m ' "$col" "$c")/" &
i=$((i + 1))
done
wait
}
follow_one() {
echo "=== $1 (tail $TAIL, Ctrl+C 종료) ==="
exec docker logs -f --tail "$TAIL" "$1"
}
pick="$1"
if [ -z "$pick" ]; then
echo " 0) 전체 (모든 컨테이너)"
for idx in "${!containers[@]}"; do
printf "%2d) %s\n" "$((idx + 1))" "${containers[$idx]}"
done
printf "번호 선택: "
read -r pick
if [ -z "$pick" ]; then
exit 0
fi
fi
if [ "$pick" = "0" ]; then
follow_all
elif [[ "$pick" =~ ^[0-9]+$ ]]; then
sel=$((pick - 1))
if [ "$sel" -lt 0 ] || [ "$sel" -ge ${#containers[@]} ]; then
echo "잘못된 번호: $pick"
exit 1
fi
follow_one "${containers[$sel]}"
else
follow_one "$pick"
fi