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

2024. 8. 9. 16:39·🌥️Cloud Study🌥️/Etc

로그 관리 정책 (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

'🌥️Cloud Study🌥️ > Etc' 카테고리의 다른 글

[ 모니터링 ] Prometheus Federation 설정  (0) 2024.08.12
[ RDS ] 쉘 스크립트에서 MySQL 연결하여 DB에 데이터 입력하기  (0) 2024.08.12
[ Prometheus ] 프로메테우스 설치 및 서비스 설정  (0) 2024.08.09
[ 모니터링 ] 인스턴스 정지 감지를 위한 Prometheus 설정  (0) 2024.08.09
[ 모니터링 ] 매트릭, 커스텀 매트릭 알아보기  (0) 2024.08.09
'🌥️Cloud Study🌥️/Etc' 카테고리의 다른 글
  • [ 모니터링 ] Prometheus Federation 설정
  • [ RDS ] 쉘 스크립트에서 MySQL 연결하여 DB에 데이터 입력하기
  • [ Prometheus ] 프로메테우스 설치 및 서비스 설정
  • [ 모니터링 ] 인스턴스 정지 감지를 위한 Prometheus 설정
L_Chae
L_Chae
🎮😻🤓🖥✨
  • L_Chae
    Cherish
    L_Chae
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 🌥️Cloud Study🌥️
        • AWS
        • NHN
        • KT
        • Microsoft (Azure 900)
        • TroubleShooting
        • IaC
        • Etc
      • STUDY
        • English
        • Japanese
        • 개인정보보호 관련
      • 초등학교 AI 교육 진행
        • 2024학년도 1학년-2학년
        • 2025학년도 4학년
      • 2024 KDT 📕
        • Lecture
        • Study 📗
        • Study-JAVA
        • Project
        • etc
      • INTERLUDE ✦
        • 2022 SYSTEM STUDY
        • 2022 Winter Study
        • 2023 AutoMobility STUDY
        • 2023 Summer Study (CPPG)
        • 2023 Reversing STUDY
        • etc
      • Private🔒
        • MacBook 💻
        • Screenshot 🩷
        • Photo 🖼️
        • FFXIV - Backup 🎮
        • Tistory
      • PBL 📗
        • 논문 스터디
        • Backup
      • Project 🖤
        • 2022-2) 개인정보보호 소학회
        • 2022-2) winter GURU2 - iOS
        • 2023-1) PBL 3
        • 2023-2) PBL 4
        • 2024-1) SW-AI교육 실습 일지
      • CTF 🚩
        • 2022
        • 2023
      • News scrap 📰
        • 2022
        • 2023
      • 2022 공부 로그 🐯
      • 2023 공부 로그🐰
  • 블로그 메뉴

    • 글쓰기
    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    deprecation warning
    멱등성
    N1
    jlpt n1 도전기
    content collection
    JLPT
    JLPT N1
    ansible
    ansible galaxy
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
L_Chae
[ Logging ] 서버 내 로그 관리 정책 수립 및 구현
상단으로

티스토리툴바