로그 관리 정책 (Log Management Policy) : 로그 파일들을 보관, 관리하고 필터링하는 일련의 과정들을 지칭하는 용어
개요 : 시간대별 로그에서, 타입별 로그를 추출하고 분석계 전달을 위해 날짜별 단위로 통합함 (shell script, crontab 이용)
- `/logs` 경로에 있는 파일들을 전부 `/log_backups` 경로로 옮김
(`/log_backups` 폴더가 없다면 추가로 만들고 `cp`로 복사) - `/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"
단계별 설명
- 로그 파일의 원본이 보관된 디렉토리 설정 (log_backup_dir):
- Spring 애플리케이션에서 생성된 로그 파일이 저장되는 경로를 설정
- 작업을 수행할 디렉토리 설정 (working_dir):
- 로그 파일을 편집할 임시 작업 디렉토리를 설정합니다. 필요 시 디렉토리를 생성
- 작업할 날짜 설정 (target_date):
- 처리할 로그 파일의 날짜를 YYYY-MM-DD 형식으로 지정
- 작업할 로그 파일들을 이동:
- 지정된 날짜의 로그 파일들을 작업 디렉토리로 이동.
ex: logcontroller.2024-08-09_16-35.log 같은 파일 이동
- 지정된 날짜의 로그 파일들을 작업 디렉토리로 이동.
- 필터링된 로그 파일을 저장할 디렉토리 설정 (filtered_log_dir):
- 필터링이 완료된 로그 파일을 저장할 디렉토리를 설정
- 로그 파일 필터링 및 원본 파일 삭제:
- 로그 파일을 순회하며 특정 패턴 (l, v, c, o로 시작하는 라인)으로 필터링하고, 필터링이 끝난 후 원본 파일을 삭제
- 필터링된 로그 파일들을 하나로 병합:
- 필터링된 로그 파일들을 하나의 파일로 병합한 후 개별 파일을 삭제하고, 최종 병합된 로그 파일의 경로를 출력
주요 수정 내용:
- 날짜 자동 추출 (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)을 이동하도록 설정함.
이렇게 하면 해당 날짜의 모든 로그 파일을 작업 디렉토리로 이동
- 이동할 때 모든 시간대에 해당하는 로그 파일(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 |