앱의 로그를 파일로 관리하라는 피드백을 받았습니다.
현재 애플리케이션을 도커에서 실행중이기 때문에 도커 외부에 저장해야합니다.
왜냐면 컨테이너의 데이터는 휘발성이니까요
앱 내부에서 파일로 저장하는게 더 좋은 방법인 것 같지만 이걸 할 당시에는 내부에서는 저장하지 않고 있었어요
서버에 들어가지 않고 로그를 확인할 수 있는 수단이 필요했기 때문에 일단 crontab과 shell 스크립트를 사용해서 로그를 저장하기로 했습니다.
crontab은 기본적으로 깔려있기 때문에 설치 할 필요가 없습니다.
crontab - e
이 명령어를 사용해서 crontab 설장 파일로 들어갑니다.
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
#!/bin/bash
#### log-reloader.sh
# 로그 저장 디렉터리
LOG_DIR="/home/logs/main"
mkdir -p "$LOG_DIR"
LOG_FILE="$LOG_DIR/main-latest.log"
# 마지막 로그 타임스탬프 저장 파일
TIMESTAMP_FILE="$LOG_DIR/last_timestamp"
# 마지막 실행 이후의 로그만 가져오기
if [[ -f "$TIMESTAMP_FILE" ]]; then
LAST_TIMESTAMP=$(cat "$TIMESTAMP_FILE")
docker logs --since "$LAST_TIMESTAMP" main >> "$LOG_FILE" 2>&1
else
docker logs main > "$TMP_LOG_FILE" 2>&1 # 실행한 적 없으면 타임 스탬프가 비어있음
fi
# 현재 타임스탬프 저장 (다음 실행을 위해)
date --utc +%FT%T > "$TIMESTAMP_FILE"
#!/bin/bash
# rotate-logs.sh
# 로그 저장 디렉터리
LOG_DIR="/home/logs/main"
mkdir -p "$LOG_DIR"
# 새로운 로그 파일 이름 (형식: main-YYYYMMDDHHMMSS.log)
NEW_LOG_FILE="$LOG_DIR/main-$(date +'%Y%m%d%H%M%S').log"
# 마지막 로그 타임스탬프 저장 파일
TIMESTAMP_FILE="$LOG_DIR/last_timestamp"
# 새로운 로그를 임시 파일에 저장
TMP_LOG_FILE=$(mktemp)
# 마지막 실행 이후의 로그만 가져오기
# 타임스탬프가 있으면 이전에 한 번 실행이 되었기 때문에 로그가 있음
if [[ -f "$TIMESTAMP_FILE" ]]; then
LAST_TIMESTAMP=$(cat "$TIMESTAMP_FILE")
cat "$LOG_DIR/main-latest.log" > "$TMP_LOG_FILE" 2>&1
else
date --utc +%FT%T > "$TIMESTAMP_FILE" # 타임스탬프 업데이트
docker logs main > "$TMP_LOG_FILE" 2>&1 # 만약 없으면 전체 로그 저장
fi
# 로그가 비어 있는지 확인
if [[ -s "$TMP_LOG_FILE" ]]; then
# 심볼릭 링크를 최신 로그 파일로 업데이트
ln -sf "$NEW_LOG_FILE" "$LOG_DIR/main-latest.log"
else
# 로그가 없으면 임시 파일 삭제
rm "$TMP_LOG_FILE"
fi
이제 crontab이 계속 지장한 시간마다 shell script를 실행하며 새로운 로그를 생성 할겁니다.
# 마지막 실행 이후의 로그만 가져오기
if [[ -f "$TIMESTAMP_FILE" ]]; then
LAST_TIMESTAMP=$(cat "$TIMESTAMP_FILE")
docker logs --since "$LAST_TIMESTAMP" main >> "$LOG_FILE" 2>&1
else
docker logs main > "$TMP_LOG_FILE" 2>&1 # 실행한 적 없으면 타임 스탬프가 비어있음
fi
######### 로그 100개 ############
# 현재 타임스탬프 저장 (다음 실행을 위해)
date --utc +%FT%T > "$TIMESTAMP_FILE"
여기에 쏟은 시간만큼 정이 들었지만 아쉽게도 조만간 버려야 할 것 같습니다,