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