#!/usr/bin/env bash # 로그 보기. # # ./log.sh 메뉴에서 고른다 # ./log.sh 1 1번 = 전체 로그 # ./log.sh 4 4번 컨테이너 # ./log.sh solution-backend 이름으로 바로 # # -n <줄> 처음에 보여줄 줄 수 (기본 200) # --no-f 따라가지 않고 지금까지만 찍고 끝낸다 set -euo pipefail cd "$(dirname "$0")" TAIL=200 FOLLOW=1 PICK="" while [ $# -gt 0 ]; do case "$1" in -n) TAIL="$2"; shift ;; --no-f|--no-follow) FOLLOW=0 ;; -h|--help) awk 'NR>1 && /^#/ {sub(/^# ?/, ""); print; next} NR>1 {exit}' "$0"; exit 0 ;; -*) echo "모르는 옵션: $1" >&2; exit 2 ;; *) PICK="$1" ;; esac shift done # 번호가 흔들리면 손이 기억한 번호가 다른 컨테이너를 연다 — 순서를 코드로 못 박는다. ORDER=(solution-backend solution-worker solution-frontend solution-site admin-backend admin-frontend) AVAILABLE=$(docker compose config --services) SVCS=() for s in "${ORDER[@]}"; do grep -qx "$s" <<<"$AVAILABLE" && SVCS+=("$s"); done # compose 에 서비스가 늘면 뒤에 붙는다(빠뜨리지 않으려고). while read -r s; do [ -n "$s" ] || continue printf '%s\n' "${SVCS[@]}" | grep -qx "$s" || SVCS+=("$s") done <<<"$AVAILABLE" # 살아 있는지 한눈에 — 죽은 걸 고르고 "로그가 안 나온다" 하는 자리를 없앤다. # ★ --format '{{.Service}}' 은 쓰지 않는다. compose v2.20 이 커스텀 템플릿을 파싱하지 못해 # 전부 "미기동" 으로 보인다(명령은 성공해서 틀린 줄 모른다). RUNNING=$(docker compose ps --services --filter status=running 2>/dev/null || true) status() { grep -qx "$1" <<<"$RUNNING" && printf '실행중' || printf '멈춤' } menu() { echo echo " o2o-web4ai 로그" echo " ─────────────────────────────" printf " 1) %-18s %s\n" "전체" "" local i=2 for s in "${SVCS[@]}"; do printf " %2d) %-18s %s\n" "$i" "$s" "[$(status "$s")]" i=$((i + 1)) done echo " q) 나가기" echo } resolve() { # 번호 또는 이름 → docker compose logs 인자 local pick="$1" if [ "$pick" = "1" ]; then TARGET=(); return; fi if [[ "$pick" =~ ^[0-9]+$ ]]; then local idx=$((pick - 2)) [ "$idx" -ge 0 ] && [ "$idx" -lt "${#SVCS[@]}" ] || { echo "그런 번호가 없다: $pick" >&2; return 1; } TARGET=("${SVCS[$idx]}"); return fi local name="${pick#o2o-web4ai-}" printf '%s\n' "${SVCS[@]}" | grep -qx "$name" || { echo "그런 컨테이너가 없다: $pick" >&2; return 1; } TARGET=("$name") } if [ -z "$PICK" ]; then menu read -rp " 번호: " PICK [ "$PICK" = "q" ] && exit 0 fi TARGET=() resolve "$PICK" || exit 2 ARGS=(--tail="$TAIL") [ "$FOLLOW" = 1 ] && ARGS+=(-f) echo "▶ docker compose logs ${ARGS[*]} ${TARGET[*]:-(전체)}" exec docker compose logs "${ARGS[@]}" ${TARGET+"${TARGET[@]}"}