[ 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
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Working in Japan
      • 🌥️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
        • 2025
      • 2022 공부 로그 🐯
      • 2023 공부 로그🐰
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    기지네트웍스
    안드로이드 바이탈스
    클라우드리스크
    그림자AI
    보안부채
    개인정보보호
    파일리스 악성코드
    보안뉴스
    바이브코딩
    디지털권위주의
    KT침해사고
    초이스재킹
    엔드포인트보안
    앱성능관리
    jlpt n1 도전기
    뉴스스터디
    인포스틸러
    APT 공격
    웨이크락
    재해복구DR
    좀비자산
    deprecation warning
    ansible
    주스재킹
    ai에이전트
    content collection
    ansible galaxy
    엘라스틱 서치
    공공기관 보안
    국가망보안체계
  • 최근 댓글

  • 최근 글

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

티스토리툴바