🌥️Cloud Study🌥️/Etc

[ Logging ] 서버 내 로그 관리 정책 수립 및 구현

L_Chae 2024. 8. 9. 16:39

로그 관리 정책 (Log Management Policy) : 로그 파일들을 보관, 관리하고 필터링하는 일련의 과정들을 지칭하는 용어

 

개요 : 시간대별 로그에서, 타입별 로그를 추출하고 분석계 전달을 위해 날짜별 단위로 통합함 (shell script, crontab 이용)

 

  1. `/logs` 경로에 있는 파일들을 전부 `/log_backups` 경로로 옮김
    (`/log_backups` 폴더가 없다면 추가로 만들고 `cp`로 복사)

  2. `/log_backups` 경로에 있는 파일들은 하나씩 까면서 내용을 `/log_aggr`경로에 있는 날짜별 파일로 복사
    - 날짜 패턴(YYYYMMDD)까지만 해서 해당 날짜 파일이 없다면 만들고 시작
    - 해당 날짜 파일이 있다면 해당 파일에 내용 추가만 하기

로그 관리 정책 수립 코드(예시)

# 1. 작업 경로 설정
bk_dir="{스프링서버에서 직접 저장하는 로그 백업본(직접 작업X) 보관 경로}"

work_dir="{로그 취합 작업 수행을 위한 2차백업 및 편집 경로}"
mkdir $work_dir

# 2. 작업 대상 날짜 설정 (리스트로 여러 날짜 지정 후 순회 필요)
work_target_ymd="{YYYYMMDD}"

# 3. 작업 대상 로그 이동 및 압축 해제
mv "$bk_dir"/log_"$work_target_ymd"_* "$work_dir"/"$work_target_ymd"/

# 4. 로그타입 필터 후 필터링 이전 파일 삭제
aggr_dir={'필터링 완료된 파일이 전달될 폴더 경로'}

mkdir "$aggr_dir"/"$work_target_ymd"/

for logfile in "$work_dir"/"$work_target_ymd"/log*; do
        filename=$(basename "$logfile")
        cat "$logfile" | grep ^[l|v|c|o] > "$aggr_dir"/"$work_target_ymd"/"$filename"
        echo "$logfile" filtering done
        rm "$logfile"
done

# 5. 필터링된 로그 하나의 파일로 병합

file_full="$aggr_dir"/"$work_target_ymd"_merged.log
touch "$file_full"

for logfile in "$aggr_dir"/"$work_target_ymd"/*; do
        cat "$logfile" >> "$file_full"
        ls -al "$file_full"
        rm "$logfile"
done

 

확인용 로그 파일 형식

ubuntu@a-private-01:~/logs$ cat logcontroller.log
l       2024-08-09T16:35:26.905484192   /products/      GET     -       -       70      -       -       -       192.168.1.20    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 null
l       2024-08-09T16:35:26.913591851   /products/      GET     -       -       40      -       -       -       192.168.1.20    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 null
l       2024-08-09T16:35:26.923149431   /products/      GET     -       -       77      -       -       -       192.168.1.20    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 null
l       2024-08-09T16:35:26.923309477   /products/      GET     -       -       77      -       -       -       192.168.1.20    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 null
l       2024-08-09T16:35:26.923395319   /products/      GET     -       -       79      -       -       -       192.168.1.20    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 null

ubuntu@a-private-01:~/logs$ cat logcontroller.2024-08-09_16-35.log
l       2024-08-09T16:35:26.905484192   /products/      GET     -       -       70      -       -       -       192.168.1.20    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36       null
l       2024-08-09T16:35:26.913591851   /products/      GET     -       -       40      -       -       -       192.168.1.20    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36       null
l       2024-08-09T16:35:26.923149431   /products/      GET     -       -       77      -       -       -       192.168.1.20    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36       null
l       2024-08-09T16:35:26.923309477   /products/      GET     -       -       77      -       -       -       192.168.1.20    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36       null
l       2024-08-09T16:35:26.923395319   /products/      GET     -       -       79      -       -       -       192.168.1.20    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36       null

 


실제 사용 코드

#!/bin/bash

# 1. 로그 파일의 원본이 보관된 디렉토리 설정
log_backup_dir="/home/ubuntu/logs"

# 2. 작업을 수행할 디렉토리 설정 (2차 백업 및 편집 작업을 위한 경로)
working_dir="/home/ubuntu/backup_logs"
mkdir -p "$working_dir"  # 디렉토리가 없으면 생성

# 3. 작업할 날짜 자동 설정 (log_backup_dir의 .log 파일에서 YYYY-MM-DD 추출)
first_log_file=$(ls "$log_backup_dir"/logcontroller.*.log | head -n 1)
target_date=$(basename "$first_log_file" | cut -d'.' -f2 | cut -d'_' -f1)

# 추출된 날짜 확인
if [ -z "$target_date" ]; then
    echo "로그 파일에서 날짜를 추출할 수 없습니다."
    exit 1
fi

# 4. 작업할 로그 파일들을 작업 디렉토리로 이동 및 해당 날짜별로 정리
mkdir -p "$working_dir/$target_date"
mv "$log_backup_dir"/logcontroller."$target_date"_*.log "$working_dir/$target_date/"

# 5. 로그 파일을 필터링한 후, 필터링 완료된 로그 파일을 저장할 디렉토리 설정
filtered_log_dir="/home/ubuntu/filter_logs" 
mkdir -p "$filtered_log_dir/$target_date"

# 6. 각 로그 파일을 순회하면서 특정 패턴으로 필터링하고, 원본 파일은 삭제하지 않음
for logfile in "$working_dir/$target_date"/logcontroller.*.log; do
    filename=$(basename "$logfile")
    
    # 로그 파일에서 l, v, c, o로 시작하는 라인만 필터링하여 저장
    grep '^[l|v|c|o]' "$logfile" > "$filtered_log_dir/$target_date/$filename"
    
    echo "$logfile 필터링 완료"
done

# 7. 필터링된 로그 파일들을 하나의 파일로 병합
merged_log_file="$filtered_log_dir/$target_date/${target_date}_merged.log"
touch "$merged_log_file"

# 필터링된 각 로그 파일을 병합한 후, 개별 파일은 삭제
for logfile in "$filtered_log_dir/$target_date"/*; do
    cat "$logfile" >> "$merged_log_file"
    echo "$logfile 병합 완료"
    rm "$logfile"  # 개별 파일 삭제
done

# 최종 병합된 로그 파일의 경로 출력
echo "최종 병합된 로그 파일: $merged_log_file"

 

단계별 설명

  1. 로그 파일의 원본이 보관된 디렉토리 설정 (log_backup_dir):
    • Spring 애플리케이션에서 생성된 로그 파일이 저장되는 경로를 설정
  2. 작업을 수행할 디렉토리 설정 (working_dir):
    • 로그 파일을 편집할 임시 작업 디렉토리를 설정합니다. 필요 시 디렉토리를 생성
  3. 작업할 날짜 설정 (target_date):
    • 처리할 로그 파일의 날짜를 YYYY-MM-DD 형식으로 지정
  4. 작업할 로그 파일들을 이동:
    • 지정된 날짜의 로그 파일들을 작업 디렉토리로 이동.
      ex: logcontroller.2024-08-09_16-35.log 같은 파일 이동
  5. 필터링된 로그 파일을 저장할 디렉토리 설정 (filtered_log_dir):
    • 필터링이 완료된 로그 파일을 저장할 디렉토리를 설정
  6. 로그 파일 필터링 및 원본 파일 삭제:
    • 로그 파일을 순회하며 특정 패턴 (l, v, c, o로 시작하는 라인)으로 필터링하고, 필터링이 끝난 후 원본 파일을 삭제
  7. 필터링된 로그 파일들을 하나로 병합:
    • 필터링된 로그 파일들을 하나의 파일로 병합한 후 개별 파일을 삭제하고, 최종 병합된 로그 파일의 경로를 출력

주요 수정 내용:

  • 날짜 자동 추출 (target_date):
    • log_backup_dir에서 .log 파일 중 첫 번째 파일의 이름에서 날짜(YYYY-MM-DD)를 추출하여 target_date로 설정
    • 이 추출된 target_date를 이후 작업에서 사용

추가 설명:

  • first_log_file: log_backup_dir에서 첫 번째로 발견된 .log 파일의 경로를 저장
  • target_date: basename과 cut 명령어를 사용하여 파일명에서 날짜 부분을 추출
  • target_date 추출 방식 변경:
    • target_date를 YYYY-MM-DD 형식으로만 추출하도록 변경. 이렇게 하면 특정 날짜에 생성된 모든 로그 파일(logcontroller.YYYY-MM-DD_HH-MM.log)을 포함할 수 있음
  • 로그 파일 이동 시 와일드카드 사용:
    • 이동할 때 모든 시간대에 해당하는 로그 파일(logcontroller.${target_date}_*.log)을 이동하도록 설정함.
      이렇게 하면 해당 날짜의 모든 로그 파일을 작업 디렉토리로 이동
  • 모든 로그 파일 병합:
    • 해당 날짜의 모든 로그 파일을 순회하며 병합하도록 함.
      이를 통해 16시 35분과 16시 38분에 생성된 로그 파일을 모두 처리할 수 있음

크론탭 코드

# 크론탭 편집
crontab -e

# 크론탭에 스케쥴 추가 : 5분 마다 자동 실행
*/5 * * * * /path/to/log_management.sh >> /path/to/log_management.log 2>&1

# 크론탭 저장 및 종료

# 크론탭 설정 확인
crontab -l

# 크론 로그 확인(옵션)
grep CRON /var/log/syslog