안녕하세요, 성장하는 개발자 여러분!
서버에 문제가 생겼을 때 여러분은 어디부터 보시나요? CPU? 메모리? 아니면 그냥… 재시작? 😅
실제로는 로그가 모든 문제의 답을 가지고 있습니다. 서버가 무엇을 하고 있는지, 어떤 에러가 발생했는지, 언제 문제가 시작되었는지… 모든 것이 로그에 기록되어 있어요.
오늘은 제가 실무에서 수없이 겪었던 장애 상황들을 통해 배운 로그 관리와 모니터링의 실전 노하우를 공유하겠습니다. 이론보다는 “지금 당장 문제를 찾고 해결하는” 관점에서 설명하겠습니다! 🔍
1. 로그의 기본: 리눅스 로깅 시스템 이해하기
로그 아키텍처: 누가 무엇을 어디에 기록하나?
현대 리눅스 시스템의 로깅은 두 주인공이 있습니다:
# 로그 시스템 구조
시스템 이벤트 → systemd-journald → rsyslogd → /var/log 파일들
↓
/run/log/journal (바이너리)
핵심 개념:
- systemd-journald: 부팅부터 모든 로그를 수집하는 중앙 집중화된 로그 수집기
- rsyslogd: 전통적인 텍스트 기반 로그 파일 생성기
- 두 시스템이 함께 동작: 호환성과 편의성을 모두 제공
실무에서 자주 확인하는 로그 파일들
# 주요 시스템 로그 위치와 용도
echo "=== 핵심 로그 파일들 ==="
# 1. 시스템 전반적인 로그
/var/log/messages # 대부분의 시스템 메시지
/var/log/syslog # 시스템 로그 (Ubuntu/Debian)
# 2. 보안 관련 로그
/var/log/secure # SSH, sudo, 인증 관련 (RHEL/CentOS)
/var/log/auth.log # 인증 로그 (Ubuntu/Debian)
# 3. 서비스별 로그
/var/log/httpd/ # Apache 웹서버
/var/log/nginx/ # Nginx 웹서버
/var/log/mysql/ # MySQL 데이터베이스
/var/log/postgresql/ # PostgreSQL 데이터베이스
# 4. 시스템 부팅 로그
/var/log/boot.log # 부팅 과정 로그
/var/log/dmesg # 커널 메시지
# 5. 크론 작업 로그
/var/log/cron # 스케줄 작업 로그
실무 팁: 로그 파일 빠르게 파악하기
# 각 로그 파일의 크기와 최근 수정 시간 확인
ls -lah /var/log/ | head -10
# 가장 큰 로그 파일들 찾기
du -ah /var/log/ | sort -hr | head -10
# 오늘 생성된 로그 파일들
find /var/log -name "*.log" -mtime 0
# 실시간으로 변화하는 로그 파일들 확인
lsof +D /var/log | grep -v "(deleted)"
2. journalctl: 현대적 로그 분석의 핵심 도구
기본 사용법과 핵심 옵션들
# 1. 전체 로그 확인 (기본)
journalctl
# 2. 실시간 로그 모니터링 (가장 많이 사용!)
journalctl -f
# 3. 최근 로그만 확인
journalctl -n 50 # 최근 50줄
journalctl --since today # 오늘부터
journalctl --since "2024-01-15 14:00:00"
# 4. 특정 기간 로그 확인
journalctl --since "2024-01-15" --until "2024-01-16"
journalctl --since "1 hour ago"
journalctl --since "30 minutes ago"
서비스별 로그 분석
# 특정 서비스 로그만 확인
journalctl -u nginx
journalctl -u mysql
journalctl -u ssh
# 여러 서비스 동시에 확인
journalctl -u nginx -u mysql
# 서비스 로그 실시간 모니터링
journalctl -u nginx -f
# 서비스 로그 with 우선순위
journalctl -u nginx -p err # 에러 레벨만
journalctl -u nginx -p warning # 경고 이상만
실전 시나리오별 로그 분석
시나리오 1: “웹사이트가 갑자기 느려졌어요!”
# 1단계: 웹서버 에러 로그 확인
journalctl -u nginx -p err --since "1 hour ago"
# 2단계: 시스템 자원 관련 로그
journalctl -p crit --since "1 hour ago"
# 3단계: 데이터베이스 관련 로그
journalctl -u mysql --since "1 hour ago" | grep -i "slow|error|warning"
# 4단계: 메모리/디스크 관련 로그
journalctl -k --since "1 hour ago" | grep -i "oom|memory|disk"
시나리오 2: “서버에 이상한 접근이 있었나요?”
# SSH 접근 시도 분석
journalctl -u ssh --since today | grep "Failed password"
# 성공한 로그인 확인
journalctl -u ssh --since today | grep "Accepted"
# 특정 IP의 활동 추적
journalctl --since today | grep "192.168.1.100"
# sudo 사용 내역 확인
journalctl --since today | grep sudo
시나리오 3: “서비스가 자꾸 재시작돼요!”
# 서비스 시작/중지 이력 확인
journalctl -u myapp --since "24 hours ago" | grep -E "(Started|Stopped|Failed)"
# 시스템 재부팅 이력
journalctl --list-boots
# 특정 부팅 세션의 로그
journalctl -b -1 # 이전 부팅
journalctl -b 0 # 현재 부팅
# 크래시 관련 로그
journalctl -p crit --since "24 hours ago"
고급 journalctl 활용법
# 1. JSON 형태로 상세 정보 확인
journalctl -o json-pretty -n 5
# 2. 특정 필드로 필터링
journalctl _PID=1234 # 특정 프로세스 ID
journalctl _UID=1000 # 특정 사용자 ID
journalctl _COMM=nginx # 특정 명령어
journalctl PRIORITY=3 # 특정 우선순위 (3=err)
# 3. 로그 크기 관리
journalctl --disk-usage # 저널 로그 용량 확인
sudo journalctl --vacuum-time=30d # 30일 이상 로그 삭제
sudo journalctl --vacuum-size=1G # 1GB 이상 로그 삭제
# 4. 로그 내보내기
journalctl --since today -o export > system_logs_$(date +%Y%m%d).journal
3. 전통적 로그 파일 분석: grep, awk, sed 마스터하기
핵심 로그 분석 명령어들
# 1. 기본 로그 읽기
tail -f /var/log/messages # 실시간 모니터링
tail -100 /var/log/secure # 마지막 100줄
head -50 /var/log/nginx/access.log # 처음 50줄
# 2. 로그 검색과 필터링
grep "error" /var/log/messages
grep -i "failed" /var/log/secure # 대소문자 구분 없이
grep -v "INFO" /var/log/app.log # INFO가 없는 줄만
grep -A 5 -B 5 "ERROR" /var/log/app.log # 앞뒤 5줄 포함
# 3. 여러 파일에서 동시 검색
grep -r "database connection" /var/log/
find /var/log -name "*.log" -exec grep -l "error" {} ;
실무에서 자주 사용하는 로그 분석 패턴
웹서버 로그 분석
# Nginx access 로그 분석
# 가장 많이 접근한 IP 찾기
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
# 404 에러가 많은 페이지 찾기
grep " 404 " /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -nr
# 시간대별 요청 수 분석
awk '{print $4}' /var/log/nginx/access.log | cut -d: -f2 | sort | uniq -c
# 특정 시간대의 로그만 확인
awk '$4 ~ /15/Jan/2024:14/ {print}' /var/log/nginx/access.log
# User-Agent 분석 (봇 탐지)
awk -F'"' '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
보안 로그 분석
# SSH 무차별 대입 공격 탐지
grep "Failed password" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr
# 성공한 로그인 후 바로 실패한 케이스 (의심스러운 활동)
grep -E "(Accepted|Failed)" /var/log/secure | grep -A1 "Accepted" | grep "Failed"
# 루트 계정 접근 시도
grep "Failed password for root" /var/log/secure
# 새로운 SSH 키 추가 감지
grep "Accepted publickey" /var/log/secure | awk '{print $9, $11}' | sort -u
시스템 성능 로그 분석
# Out of Memory 이벤트 찾기
dmesg | grep -i "out of memory"
grep -i "oom" /var/log/messages
# 디스크 관련 에러
grep -i "disk|ata|scsi" /var/log/messages | grep -i error
# 네트워크 관련 에러
grep -i "network|eth0|connection" /var/log/messages | grep -i error
로그 분석 자동화 스크립트
#!/bin/bash
# log_analyzer.sh - 종합 로그 분석 스크립트
LOG_DATE=$(date +%Y%m%d)
REPORT_FILE="/tmp/log_analysis_${LOG_DATE}.txt"
echo "=== 시스템 로그 분석 리포트 $(date) ===" > $REPORT_FILE
# 1. 시스템 에러 요약
echo "1. 시스템 에러 요약:" >> $REPORT_FILE
journalctl -p err --since today --no-pager | wc -l >> $REPORT_FILE
echo "총 에러 수: $(journalctl -p err --since today --no-pager | wc -l)" >> $REPORT_FILE
# 2. 가장 많이 발생한 에러들
echo -e "n2. 주요 에러 메시지:" >> $REPORT_FILE
journalctl -p err --since today --no-pager | awk '{$1=$2=$3=""; print $0}' | sort | uniq -c | sort -nr | head -5 >> $REPORT_FILE
# 3. SSH 접근 분석
echo -e "n3. SSH 접근 분석:" >> $REPORT_FILE
echo "실패한 로그인 시도: $(grep "Failed password" /var/log/secure | grep "$(date +%b %d)" | wc -l)" >> $REPORT_FILE
echo "성공한 로그인: $(grep "Accepted" /var/log/secure | grep "$(date +%b %d)" | wc -l)" >> $REPORT_FILE
# 4. 상위 공격자 IP
echo -e "n4. 상위 공격자 IP (실패한 로그인):" >> $REPORT_FILE
grep "Failed password" /var/log/secure | grep "$(date +%b %d)" | awk '{print $11}' | sort | uniq -c | sort -nr | head -5 >> $REPORT_FILE
# 5. 디스크 사용량과 로그 크기
echo -e "n5. 로그 파일 크기 분석:" >> $REPORT_FILE
echo "전체 /var/log 사용량: $(du -sh /var/log | cut -f1)" >> $REPORT_FILE
echo "journalctl 사용량: $(journalctl --disk-usage | grep -o '[0-9.]*[KMGT]B')" >> $REPORT_FILE
# 6. 서비스 상태 요약
echo -e "n6. 주요 서비스 상태:" >> $REPORT_FILE
for service in nginx mysql ssh firewalld; do
if systemctl is-active $service > /dev/null 2>&1; then
echo "$service: 정상" >> $REPORT_FILE
else
echo "$service: 비정상" >> $REPORT_FILE
fi
done
echo "분석 완료: $REPORT_FILE"
cat $REPORT_FILE
4. 실시간 모니터링과 알림 시스템 구축
실시간 로그 모니터링 대시보드
# 멀티 터미널 모니터링 스크립트
#!/bin/bash
# monitor_dashboard.sh
# 터미널을 4개 영역으로 분할하여 실시간 모니터링
tmux new-session -d -s monitoring
# 상단 좌측: 시스템 전체 에러 로그
tmux send-keys -t monitoring "journalctl -f -p err" Enter
# 상단 우측: 웹서버 로그
tmux split-window -h -t monitoring
tmux send-keys -t monitoring "tail -f /var/log/nginx/error.log" Enter
# 하단 좌측: SSH 접근 로그
tmux split-window -v -t monitoring:0.0
tmux send-keys -t monitoring "journalctl -u ssh -f" Enter
# 하단 우측: 시스템 리소스
tmux split-window -v -t monitoring:0.1
tmux send-keys -t monitoring "htop" Enter
# 세션 접속
tmux attach-session -t monitoring
로그 기반 알림 시스템
#!/bin/bash
# log_alert_system.sh - 로그 기반 실시간 알림
WEBHOOK_URL="YOUR_SLACK_WEBHOOK_URL"
ALERT_LOG="/var/log/alert_system.log"
# 슬랙 알림 함수
send_slack_alert() {
local message="$1"
local level="$2"
local emoji="🔴"
case $level in
"warning") emoji="⚠️" ;;
"info") emoji="ℹ️" ;;
"critical") emoji="🚨" ;;
esac
curl -X POST -H 'Content-type: application/json'
--data "{"text":"$emoji $message"}"
$WEBHOOK_URL
}
# 1. SSH 무차별 대입 공격 감지
check_ssh_attacks() {
local attacks=$(grep "Failed password" /var/log/secure | grep "$(date +%b %d)" | wc -l)
if [ $attacks -gt 50 ]; then
local top_attacker=$(grep "Failed password" /var/log/secure | grep "$(date +%b %d)" |
awk '{print $11}' | sort | uniq -c | sort -nr | head -1)
send_slack_alert "SSH 무차별 대입 공격 감지! 총 $attacks 회 시도. 주요 공격자: $top_attacker" "critical"
fi
}
# 2. 시스템 에러 급증 감지
check_system_errors() {
local errors=$(journalctl -p err --since "10 minutes ago" --no-pager | wc -l)
if [ $errors -gt 20 ]; then
send_slack_alert "시스템 에러 급증! 최근 10분간 $errors 개 에러 발생" "critical"
fi
}
# 3. 디스크 공간 부족 경고
check_disk_space() {
local usage=$(df /var/log | tail -1 | awk '{print $5}' | sed 's/%//')
if [ $usage -gt 90 ]; then
send_slack_alert "로그 디스크 공간 부족! 현재 사용률: ${usage}%" "warning"
fi
}
# 4. 중요 서비스 다운 감지
check_critical_services() {
for service in nginx mysql ssh; do
if ! systemctl is-active $service > /dev/null 2>&1; then
send_slack_alert "$service 서비스가 중지되었습니다!" "critical"
fi
done
}
# 5. OOM(Out of Memory) 이벤트 감지
check_oom_events() {
local oom_count=$(dmesg | grep -i "killed process" | grep "$(date +%b %d)" | wc -l)
if [ $oom_count -gt 0 ]; then
local killed_process=$(dmesg | grep -i "killed process" | tail -1 | awk '{print $NF}')
send_slack_alert "메모리 부족으로 프로세스 종료! 종료된 프로세스: $killed_process" "critical"
fi
}
# 메인 실행부
main() {
echo "$(date): 로그 모니터링 시작" >> $ALERT_LOG
check_ssh_attacks
check_system_errors
check_disk_space
check_critical_services
check_oom_events
echo "$(date): 로그 모니터링 완료" >> $ALERT_LOG
}
# crontab에 등록: */5 * * * * /path/to/log_alert_system.sh
main
로그 순환(Log Rotation) 관리
# logrotate 설정 최적화
sudo nano /etc/logrotate.d/custom-app
# 커스텀 애플리케이션 로그 순환 설정
/var/log/myapp/*.log {
daily # 매일 순환
rotate 30 # 30개 파일 보관
compress # 압축 저장
delaycompress # 다음 순환 때 압축
missingok # 파일이 없어도 에러 없음
notifempty # 빈 파일은 순환하지 않음
create 644 myapp myapp # 새 파일 권한 설정
postrotate
systemctl reload myapp
endscript
}
# logrotate 테스트
sudo logrotate -d /etc/logrotate.d/custom-app # 드라이런
sudo logrotate -f /etc/logrotate.d/custom-app # 강제 실행
5. 성능 모니터링과 프로파일링
시스템 성능 로그 분석
# 1. CPU 사용률 이력 확인
sar -u 1 10 # 1초마다 10번 CPU 사용률 확인
sar -u -f /var/log/sa/sa$(date +%d) # 오늘의 CPU 이력
# 2. 메모리 사용 패턴 분석
sar -r 1 10 # 메모리 사용률
free -h && cat /proc/meminfo | grep -E "(MemTotal|MemFree|MemAvailable|Buffers|Cached)"
# 3. 디스크 I/O 분석
iotop -o # I/O 사용량이 높은 프로세스만
iostat -x 1 5 # 디스크 I/O 상세 통계
# 4. 네트워크 연결 상태 분석
ss -tuln | awk '{print $1}' | sort | uniq -c # 연결 타입별 통계
netstat -i # 인터페이스별 통계
애플리케이션 성능 모니터링
# 1. 프로세스별 리소스 사용량 추적
pidstat -u -r -d 1 10 -p $(pgrep nginx) # nginx 프로세스 모니터링
# 2. 시스템 콜 추적
strace -c -p $(pgrep nginx) # nginx의 시스템 콜 통계
strace -f -e trace=file nginx # 파일 관련 시스템 콜만
# 3. 네트워크 연결 모니터링
ss -i # 소켓 상세 정보
lsof -i :80 # 80 포트 사용 프로세스
종합 모니터링 스크립트
#!/bin/bash
# comprehensive_monitor.sh - 종합 시스템 모니터링
REPORT_DIR="/var/log/monitoring"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
REPORT_FILE="$REPORT_DIR/system_report_$TIMESTAMP.txt"
mkdir -p $REPORT_DIR
exec > >(tee $REPORT_FILE)
exec 2>&1
echo "=== 종합 시스템 모니터링 리포트 $(date) ==="
# 1. 시스템 기본 정보
echo -e "n1. 시스템 기본 정보:"
echo "호스트명: $(hostname)"
echo "운영체제: $(cat /etc/os-release | grep PRETTY_NAME | cut -d'"' -f2)"
echo "커널: $(uname -r)"
echo "업타임: $(uptime -p)"
echo "부하 평균: $(uptime | cut -d':' -f4-)"
# 2. CPU 및 메모리 상태
echo -e "n2. CPU 및 메모리 상태:"
echo "CPU 코어 수: $(nproc)"
echo "CPU 사용률 (1분 평균): $(sar -u 1 1 | tail -1 | awk '{print 100-$8}')%"
echo "메모리 사용률: $(free | grep Mem | awk '{printf "%.1f%%", $3/$2 * 100.0}')"
echo "스왑 사용률: $(free | grep Swap | awk '{printf "%.1f%%", $3/$2 * 100.0}')"
# 3. 디스크 사용량
echo -e "n3. 디스크 사용량:"
df -h | grep -v tmpfs | grep -v devtmpfs
# 4. 네트워크 상태
echo -e "n4. 네트워크 상태:"
echo "활성 연결 수: $(ss -t state established | wc -l)"
echo "리스닝 포트: $(ss -tuln | grep LISTEN | wc -l)"
# 5. 프로세스 TOP 10
echo -e "n5. CPU 사용률 상위 프로세스:"
ps aux --sort=-%cpu | head -11
echo -e "n6. 메모리 사용률 상위 프로세스:"
ps aux --sort=-%mem | head -11
# 7. 최근 에러 로그
echo -e "n7. 최근 1시간 에러 로그 (상위 10개):"
journalctl -p err --since "1 hour ago" --no-pager | tail -10
# 8. 서비스 상태
echo -e "n8. 주요 서비스 상태:"
for service in ssh nginx mysql docker; do
if systemctl list-unit-files | grep -q "^$service.service"; then
status=$(systemctl is-active $service 2>/dev/null || echo "inactive")
echo "$service: $status"
fi
done
# 9. 보안 이벤트 요약
echo -e "n9. 보안 이벤트 요약 (오늘):"
echo "SSH 로그인 실패: $(grep "Failed password" /var/log/secure 2>/dev/null | grep "$(date +%b %d)" | wc -l)"
echo "SSH 로그인 성공: $(grep "Accepted" /var/log/secure 2>/dev/null | grep "$(date +%b %d)" | wc -l)"
echo "sudo 사용: $(journalctl --since today | grep sudo | wc -l)"
echo -e "n=== 리포트 완료 ==="
echo "리포트 파일: $REPORT_FILE"
# 이전 리포트 정리 (7일 이상 된 것)
find $REPORT_DIR -name "system_report_*.txt" -mtime +7 -delete
6. 로그 보안과 컴플라이언스
로그 무결성 보장
# 1. 로그 파일 권한 설정
sudo chmod 640 /var/log/messages
sudo chown root:adm /var/log/secure
# 2. 로그 변조 방지를 위한 체크섬 생성
#!/bin/bash
# log_integrity_check.sh
LOG_CHECKSUM_DIR="/var/log/checksums"
mkdir -p $LOG_CHECKSUM_DIR
# 중요 로그 파일들의 체크섬 생성
for logfile in /var/log/messages /var/log/secure /var/log/audit/audit.log; do
if [ -f "$logfile" ]; then
checksum_file="$LOG_CHECKSUM_DIR/$(basename $logfile).sha256"
sha256sum "$logfile" > "$checksum_file.new"
# 이전 체크섬과 비교
if [ -f "$checksum_file" ]; then
if ! diff "$checksum_file" "$checksum_file.new" > /dev/null; then
echo "경고: $logfile 이 변조되었을 수 있습니다!"
logger "LOG_INTEGRITY_WARNING: $logfile checksum mismatch"
fi
fi
mv "$checksum_file.new" "$checksum_file"
fi
done
중앙 집중식 로그 수집 (Rsyslog)
# rsyslog 서버 설정 (/etc/rsyslog.conf)
# 중앙 로그 서버로 설정
# UDP로 로그 수신 허용
$ModLoad imudp
$UDPServerRun 514
$UDPServerAddress 0.0.0.0
# TCP로 로그 수신 허용 (더 안전)
$ModLoad imtcp
$InputTCPServerRun 514
# 클라이언트별로 로그 분리 저장
$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
& stop
# 클라이언트 설정 - 중앙 서버로 로그 전송
echo "*.* @@log-server:514" >> /etc/rsyslog.conf
systemctl restart rsyslog
7. 트러블슈팅 실전 시나리오
시나리오 1: “사이트가 갑자기 500 에러를 내뿜어요!”
# 단계별 진단 과정
echo "=== 웹 서버 500 에러 트러블슈팅 ==="
# 1. 웹서버 에러 로그 즉시 확인
echo "1. 웹서버 에러 로그:"
tail -50 /var/log/nginx/error.log
# 2. 애플리케이션 로그 확인
echo -e "n2. 애플리케이션 로그:"
journalctl -u myapp -n 50
# 3. 데이터베이스 연결 확인
echo -e "n3. 데이터베이스 상태:"
systemctl status mysql
journalctl -u mysql -n 20
# 4. 시스템 리소스 확인
echo -e "n4. 시스템 리소스:"
free -h
df -h | grep -v tmpfs
# 5. 네트워크 연결 상태
echo -e "n5. 네트워크 연결:"
ss -tuln | grep :80
ss -tuln | grep :3306
시나리오 2: “서버가 자꾸 멈춰요!”
# 시스템 행업/프리징 분석
echo "=== 시스템 행업 분석 ==="
# 1. 커널 메시지 확인
dmesg | tail -50
# 2. 높은 CPU 사용 프로세스
echo -e "n2. CPU 사용률 TOP 10:"
ps aux --sort=-%cpu | head -11
# 3. 메모리 부족 이벤트
echo -e "n3. OOM 이벤트 확인:"
dmesg | grep -i "out of memory"
journalctl --since today | grep -i "oom"
# 4. I/O 대기 상태 프로세스
echo -e "n4. I/O 대기 프로세스:"
ps aux | awk '$8 ~ /D/ { print $0 }'
# 5. 시스템 부하 이력
echo -e "n5. 시스템 부하 이력:"
sar -q 1 5
시나리오 3: “데이터가 사라졌어요!”
# 데이터 손실 원인 분석
echo "=== 데이터 손실 원인 분석 ==="
# 1. 파일시스템 에러 확인
echo "1. 파일시스템 에러:"
dmesg | grep -i "error|fail" | grep -E "(sd[a-z]|nvme|ext4|xfs)"
# 2. 디스크 하드웨어 상태
echo -e "n2. 디스크 상태:"
smartctl -a /dev/sda | grep -E "(Health|Error)"
# 3. 백업 관련 로그
echo -e "n3. 백업 로그:"
journalctl -u backup -n 20
# 4. 사용자 활동 로그
echo -e "n4. 최근 사용자 활동:"
last -10
journalctl --since today | grep sudo | grep -E "(rm|mv|delete)"
# 5. 애플리케이션 데이터베이스 로그
echo -e "n5. 데이터베이스 로그:"
grep -i "drop|delete|truncate" /var/log/mysql/mysql.log
마치며: 로그로 시스템과 대화하기
핵심 원칙 정리
- 실시간 모니터링:
journalctl -f와 tail -f를 습관화하세요
- 패턴 인식: 정상적인 로그 패턴을 먼저 익히세요
- 체계적 접근: 문제 발생 시 단계별로 로그를 확인하세요
- 자동화: 반복적인 분석 작업은 스크립트로 자동화하세요
로그 분석가가 되기 위한 일일 습관
# 매일 아침 실행하는 로그 체크 루틴
#!/bin/bash
echo "=== 오늘의 시스템 상태 $(date) ==="
# 1. 어제부터 오늘까지의 에러 요약
journalctl -p err --since yesterday --no-pager | wc -l
# 2. 새로운 SSH 접속
grep "Accepted" /var/log/secure | grep "$(date +%b %d)"
# 3. 시스템 리소스 상태
free -h | grep Mem
df -h | grep -v tmpfs | grep -E "9[0-9]%|100%"
# 4. 중요 서비스 상태
systemctl is-active nginx mysql ssh
echo "좋은 하루 되세요! 🚀"
다음 단계
초급자라면:
journalctl -f로 실시간 로그 모니터링 연습
- 기본 grep 패턴으로 로그 검색 연습
- 주요 로그 파일 위치 암기
중급자라면:
- 복잡한 awk/sed 패턴으로 로그 분석
- 자동화 스크립트 작성
- 중앙 집중식 로그 시스템 구축
고급자라면:
- ELK 스택이나 Grafana와 연동
- 머신러닝 기반 이상 탐지
- 컴플라이언스 로그 관리
기억하세요: 로그는 시스템이 우리에게 보내는 메시지입니다. 이 메시지를 잘 읽을 수 있다면, 여러분은 시스템과 진정한 대화를 나눌 수 있는 운영 전문가가 될 것입니다! 📊
다음 포스트에서는 “Production 환경 구성도 설계법”을 통해 실제 서비스 운영 환경을 어떻게 설계하고 관리하는지 알아보겠습니다. 기대해 주세요!