WAS(JBoss)의 nohup 로그가 rotate되지 않고 기하급수적으로 쌓인 특정 서버를 발견하고,

이번 기회에 nohup 로그를 일 단위로 rotation 하고, 90일 지난 로그는 삭제하도록 설정하는 방법에 대해 정리해 보고자 한다.


1. 'log_management.sh' 쉘 스크립트 작성

#!/bin/bash

JVM_NAME="$1"

LOG_FILE="/JVM_PATH/${JVM_NAME}/log/nohup/${JVM_NAME}.out"
DATE=$(date +%y%m%d_%H%M%S)
ROTATED_FILE="/JVM_PATH/${JVM_NAME}/log/nohup/${JVM_NAME}.out.${DATE}"


log_rotation() {

    if [[ -s $LOG_FILE ]]; then
        cp "${LOG_FILE}" "${ROTATED_FILE}"
        echo "logfile backup completed!!! cp ${LOG_FILE} ${ROTATED_FILE}"
        cat /dev/null > "${LOG_FILE}"
        
        chown {JBoss Service 계정}:{JBoss Service 그룹} ${ROTATED_FILE}
    else
        echo "There aren't any logs in ${LOG_FILE}"
    fi

    echo "*******************************************************"
}

log_delete() {
    find "/JVM_PATH/${JVM_NAME}/log/nohup/" -mtime +90 -name '*.out.*' | xargs rm
}

log_rotation
log_delete

 

nohup log의 rotation하는 로직은 간단하다.

현재까지 쌓인 nohup log 파일을 쉘 스크립트가 수행되는 시점이 들어간 파일명으로 복사한 후,

현재 쌓이고 있는 nohup log 파일은 아무 내용이 없도록 만드는 것이다.

이러한 간단한 로직이므로, 이 포스팅에서는 현재까지 쌓인 모든 nohup log를 날짜별로 파싱하여 해당 날짜별로 로그 파일을 따로 분리하는 것은 아님을 유의하자!

 

각 구문들을 간략히 설명해 보자면 다음과 같다.

  • JVM_NAME="$1"
    'log_management.sh' 쉘 스크립트를 실행할 때, argumentJVM Name을 넣어 특정 JVM의 nohup log 파일만 rotation 및 삭제하도록 구현하였다.

  • LOG_FILE="/JVM_PATH/${JVM_NAME}/log/nohup/${JVM_NAME}.out"
    nohup log 파일이 쌓이는 절대 경로를 넣은 변수이다.

  • DATE=$(date +%y%m%d_%H%M%S)
    쉘 스크립트를 수행하는 시점의 시간을 '20240521_160125' 와 같은 형태로 넣는 변수이다.

  • ROTATED_FILE="/JVM_PATH/${JVM_NAME}/log/nohup/${JVM_NAME}.out.${DATE}"
    nohup log 파일이 rotation 하여 복사될 log 파일의 절대 경로를 넣은 변수이다.

  • cat /dev/null > "${LOG_FILE}"
    현재 쌓이고 있는 nohup log 파일을 비우는 명령어이다.

  • chown {JBoss Service 계정}:{JBoss Service 그룹} ${ROTATED_FILE}
    rotate된 로그 파일의 소유권 Jboss 서비스 계정 및 그룹에게 넘겨, 추후 JBoss start,stop 시 에러가 생기지 않도록 한다.

  • find "/JVM_PATH/${JVM_NAME}/log/nohup/-mtime +90 -name '*.out.*' | xargs rm
    nohup log가 쌓이는 경로에서 파일명에 .out이 들어가는 모든 파일들 중 파일 수정 timestamp가 90일 이상이 된 파일들을 삭제하도록 하는 명령어이다.

 

(번외) 로그 파일들을 gzip 으로 압축하는 방법

아래 쉘 스크립트를 추가하면, 현재 쓰여지고 있는 로그를 제외한 nohup log, gclog, server.log (Jboss log) 의 모든 로그들을 gzip으로 압축시킬 수 있다.

find "로그파일의 상위 디렉토리" ! -name '*.gz' \( -name '*.out.*' -o -name '*.hprof' -o -name 'gc*.log' -o -name '*.log.*' \) -exec gzip {} \;

 


2. 쉘 스크립트를 주기적으로 실행하도록 설정 - crond 이용

2.1. 현재 등록된 cron job 확인

crontab -l

위 명령어를 수행하여, 현재 crond 로 어떤 job들이 수행되고 있는 지 확인해보자!

 

2.2. crontab에 'log_management.sh' 를 실행하도록 설정

# cron job 을 특정 주기로 등록하는 editor를 연다.
crontab -e

# 아래 내용을 넣고 저장
# minute hour day_of_month month weekday command
# 아래 문구는 매일 23시 59분으로 설정하여, 매일 nohup log가 rotation 및 삭제되도록 설정하는 것이다.
# 쉘 스크립트를 실행할 때, 마지막에 JVM Name에 해당하는 argument를 넣는 것을 잊지 말자!
59 23 * * * /PATH/log_management.sh JVM_NAME

 

위와 같이 crontab 내용을 설정하면 되는데, 해당 쉘 스크립트가 잘 동작하는 지 23시 59분까지 기다릴 수 없다면,

아래 방법으로 지금부터 매 분마다 수행되도록 하여 테스트 해보도록 하자!

# 테스트용 crontab 내용
* * * * * /PATH/log_management.sh JVM_NAME

 

2.3. cron 데몬 재시작 (생략 가능)

crontab -e 명령어로 crontab 에디터를 연 후, 알맞게 설정하여 저장하였다면, 

해당 서버 내의 cron 데몬이 특이하게(?) 설정되어 있지 않다면, 특정 시간마다 crontab 내용을 읽어들여 자동으로 스케줄링을 하게 된다.

 

만약 적용되었는 지 확실치 않아 찝찝하다면, 아래 명령어를 수행하여 cron 데몬을 재시작 하도록 하자.

# cron 데몬 재시작
systemctl restart crond.service

# cron 데몬 서비스 상태 확인
systemctl status crond.service

 

위 과정을 모두 마쳤다면, 다음날에 반드시 nohup log의 rotation 과 삭제가 제대로 수행되었는 지 확인해보도록 하자!


참고

https://green-joo.tistory.com/26

 

nohup 사용법과 nohup.out 파일 명 변경, 로그 없이, 날짜 별로 rotation 하는 방법 ( Linux )

안녕하세요. 그린주입니다 ๑'ٮ'๑ 오늘도 힘차게 시작해보겠습니다! 개요 이번 글에서는 nohup 사용법과 nohup.out 로그 관련 설정, 프로세스를 종료하는 방법을 공유하고자 합니다. 목차 nohup 설명

green-joo.tistory.com

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기