본문으로 건너뛰기

거대한 로그 파일에서 원하는 내용 찾기 완벽 가이드

· 약 11분
Braun Park
Curious Developer

서버 운영이나 개발 중에 로그 파일이 몇 GB씩 커져서 원하는 내용을 찾기 어려운 경험, 다들 있으실 거예요.

특히 tail -f로 실시간 모니터링은 되지만 이전 로그를 확인하려면 막막하고, 파일이 너무 커서 에디터로 열기도 부담스럽죠.

실제 개발 현장에서 겪은 로그 분석 문제들과 해결 방법을 정리해봤습니다.

이런 상황에서 도움이 됩니다:

  • 몇 GB짜리 로그 파일에서 특정 에러 찾기
  • 특정 시간대의 로그만 확인하고 싶을 때
  • 실시간 모니터링과 과거 로그 분석을 동시에
  • 로그 파일이 너무 커서 vim/nano로 열 수 없을 때

🎯 문제 상황 분석

일반적인 로그 분석 문제들

파일 크기 문제:

  • 로그 파일이 몇 GB로 커져서 에디터로 열기 어려움
  • cat 명령어로는 터미널이 멈춤
  • tail -f는 실시간만 보여주고 이전 내용 확인 불가

검색 효율성 문제:

  • 특정 시간대나 에러만 보고 싶은데 전체를 다 봐야 함
  • 여러 터미널 창을 띄워 작업하기 번거로움
  • 실시간 모니터링 중에 과거 로그 확인이 어려움

로그 분할의 한계:

  • 물론 일자별이나 특정 용량 단위로 나눠서 저장하면 조금 낫지만, 그 안에서도 찾기 어려운 부분이 있습니다
  • 하루 단위로 나뉜 로그라도 수십만 라인이 되면 여전히 분석이 쉽지 않음
  • 로그 회전(rotation) 설정이 없는 레거시 시스템의 경우 더욱 심각

로그 분석의 핵심 요구사항

  1. 실시간 모니터링: 새로운 로그를 즉시 확인
  2. 과거 로그 탐색: 특정 시간대나 패턴으로 검색
  3. 효율적인 탐색: 거대한 파일에서 빠른 이동
  4. 멀티태스킹: 모니터링과 분석을 동시에

🛠️ 핵심 도구별 활용법

1. less - 가장 강력한 로그 뷰어

기본 사용법

# 로그 파일 열기
less catalina.out

# 파일 끝으로 이동
Shift + G

# 파일 처음으로 이동
1G 또는 gg

위치 지정해서 열기

# 파일의 90% 지점부터 시작 (최근 로그 확인에 유용)
less +90% catalina.out

# 특정 라인 번호부터
less +1000 catalina.out

# 특정 패턴부터 시작
less +/ERROR catalina.out
less +/"$(date '+%Y-%m-%d 14:')" catalina.out

less 내부 검색

# less 실행 후 검색
/ERROR # ERROR 검색
/2024-09-23 # 특정 날짜 검색
n # 다음 검색 결과
N # 이전 검색 결과

실시간 모니터링 모드

# 실시간 모니터링으로 시작
less +F catalina.out

# 실시간 모드에서:
Ctrl + C # 실시간 모드 중단 (스크롤 가능)
F # 실시간 모드 재개
q # 종료

2. tail - 실시간 모니터링의 기본

기본 실시간 모니터링

# 기본 실시간 모니터링
tail -f catalina.out

# 마지막 N줄부터 실시간 모니터링
tail -n 1000 -f catalina.out
tail -10000 -f catalina.out

특정 조건으로 필터링하며 모니터링

# 에러 로그만 실시간 모니터링
tail -f catalina.out | grep ERROR

# 오늘 날짜 로그만 실시간 모니터링
tail -f catalina.out | grep "$(date '+%Y-%m-%d')"

# 여러 조건 조합
tail -f catalina.out | grep "$(date '+%Y-%m-%d')" | grep -E "(ERROR|WARN)"

3. grep - 패턴 기반 검색의 핵심

날짜/시간 기반 검색

# 오늘 로그만 추출
grep "$(date '+%Y-%m-%d')" catalina.out

# 어제 로그만 추출
grep "$(date -d yesterday '+%Y-%m-%d')" catalina.out

# 특정 시간대 (14-16시)
grep "$(date '+%Y-%m-%d 1[4-6]:')" catalina.out

# 최근 N시간
grep "$(date '+%Y-%m-%d %H:')" catalina.out

에러 레벨별 검색

# ERROR 로그만
grep ERROR catalina.out

# ERROR 또는 WARN
grep -E "(ERROR|WARN)" catalina.out

# 대소문자 구분 없이
grep -i error catalina.out

# 에러와 특정 키워드 동시에
grep ERROR catalina.out | grep database

컨텍스트와 함께 검색

# 매칭된 라인 앞뒤 5줄씩 표시
grep -C 5 ERROR catalina.out

# 매칭된 라인 앞 3줄, 뒤 2줄
grep -B 3 -A 2 ERROR catalina.out

# 라인 번호와 함께
grep -n ERROR catalina.out

🔧 실무 워크플로우

워크플로우 1: 문제 발생 시 즉시 대응

# 1단계: 최근 에러 확인 (최근 10분)
tail -n 1000 catalina.out | grep ERROR

# 2단계: 실시간 에러 모니터링 시작
tail -f catalina.out | grep --color=always ERROR

# 3단계: 별도 터미널에서 과거 로그 분석
less +/ERROR catalina.out

워크플로우 2: 특정 시간대 문제 분석

# 1단계: 문제 발생 시간대 로그 추출
grep "2024-09-23 14:" catalina.out > debug_14h.log

# 2단계: 추출된 로그에서 에러 패턴 분석
grep -E "(ERROR|EXCEPTION|FAIL)" debug_14h.log

# 3단계: 에러 전후 상황 확인
grep -C 10 ERROR debug_14h.log | less

워크플로우 3: 성능 분석

# 1단계: 응답 시간 관련 로그 추출
grep "response_time" catalina.out | grep "$(date '+%Y-%m-%d')"

# 2단계: 느린 응답 찾기 (예: 5초 이상)
grep "response_time.*[5-9][0-9][0-9][0-9]ms" catalina.out

# 3단계: 시간대별 성능 추이 확인
grep "$(date '+%Y-%m-%d')" catalina.out | grep "response_time" | cut -d' ' -f1-2,8

🚀 고급 기법

멀티 터미널 활용법

터미널 1: 실시간 모니터링

# 전체 로그 실시간 모니터링
tail -f catalina.out

터미널 2: 에러 전용 모니터링

# 에러만 실시간 모니터링
tail -f catalina.out | grep --color=always ERROR

터미널 3: 과거 로그 분석

# 과거 로그 탐색 및 분석
less catalina.out

tmux를 활용한 화면 분할

# tmux 세션 시작
tmux new-session -d -s logs

# 화면을 세로로 분할
tmux split-window -h

# 첫 번째 창: 전체 로그 탐색
tmux send-keys -t 0 'less catalina.out' Enter

# 두 번째 창: 실시간 에러 모니터링
tmux send-keys -t 1 'tail -f catalina.out | grep ERROR' Enter

# 세션 접속
tmux attach -t logs

로그 파일 사전 처리

큰 로그 파일 분할

# 크기별로 분할 (100MB씩)
split -b 100M catalina.out crawler_part_

# 라인 수별로 분할 (100만 라인씩)
split -l 1000000 catalina.out crawler_part_

# 날짜별로 분할
grep "2024-09-23" catalina.out > crawler_2024-09-23.log
grep "2024-09-22" catalina.out > crawler_2024-09-22.log

로그 압축 및 회전

# 오래된 로그 압축
gzip catalina.out.old

# logrotate 설정 예시
cat > /etc/logrotate.d/crawler << EOF
/path/to/catalina.out {
daily
rotate 30
compress
missingok
notifempty
create 0644 user group
postrotate
/usr/bin/systemctl reload crawler
endscript
}
EOF

🎨 컬러와 가독성 향상

검색 결과 하이라이트

# grep 결과에 컬러 적용
grep --color=always ERROR catalina.out | less -R

# 여러 패턴을 다른 색으로
grep --color=always ERROR catalina.out | grep --color=always WARNING | less -R

less 설정 최적화

# ~/.bashrc에 추가
export LESS='-R --use-color'
export LESSOPEN='|/usr/bin/lesspipe %s'

# less에서 검색 시 대소문자 무시
export LESS="$LESS -i"

유용한 alias 설정

# ~/.bashrc에 추가
alias logtail='tail -f'
alias logless='less +F'
alias logerror='grep --color=always ERROR'
alias logtoday='grep "$(date "+%Y-%m-%d")"'
alias logyesterday='grep "$(date -d yesterday "+%Y-%m-%d")"'

# 조합 alias
alias errortoday='grep "$(date "+%Y-%m-%d")" | grep --color=always ERROR'

⚡ 성능 최적화 팁

검색 성능 향상

# 바이너리 파일 제외하고 빠른 검색
grep --text ERROR catalina.out

# 고정 문자열 검색 (정규식 X)
fgrep "exact string" catalina.out

# 여러 파일 동시 검색
grep ERROR *.log

# 병렬 검색 (GNU parallel 사용)
find . -name "*.log" | parallel grep ERROR

메모리 효율적인 분석

# 스트림 처리로 메모리 절약
cat catalina.out | grep ERROR | head -100

# 큰 파일의 특정 부분만 처리
sed -n '1000,2000p' catalina.out | grep ERROR

# 시간 범위로 제한해서 처리
awk '/2024-09-23 14:00/,/2024-09-23 15:00/' catalina.out | grep ERROR

🛡️ 실무 체크리스트

로그 분석 전 준비사항

파일 상태 확인:

# 파일 크기 확인
ls -lh catalina.out

# 마지막 수정 시간 확인
stat catalina.out

# 현재 쓰기 중인지 확인
lsof catalina.out

시스템 리소스 확인:

# 디스크 공간 확인
df -h

# 메모리 사용량 확인
free -h

# CPU 사용률 확인
top

문제 해결 순서

  1. 즉시 대응: tail -f | grep ERROR로 실시간 문제 확인
  2. 범위 축소: 시간대별로 로그 필터링
  3. 패턴 분석: 에러 패턴과 빈도 확인
  4. 상관관계: 에러 전후 상황 분석
  5. 근본원인: 로그 트레이스로 원인 추적

자주 사용하는 명령어 모음

# 실시간 에러 모니터링
tail -f app.log | grep --color=always -E "(ERROR|EXCEPTION|FATAL)"

# 오늘 에러 요약
grep "$(date '+%Y-%m-%d')" app.log | grep ERROR | cut -d' ' -f3- | sort | uniq -c

# 시간대별 에러 분포
grep ERROR app.log | cut -d' ' -f1-2 | cut -d':' -f1-2 | sort | uniq -c

# 특정 시간 범위 로그 (어제 18시~오늘 6시)
awk '/2024-09-22 18:00/,/2024-09-23 06:00/' app.log

# API 응답 시간 분석
grep "response_time" app.log | awk '{print $8}' | sort -n | tail -10

📊 로그 분석 자동화

스크립트 예시: 일일 로그 요약

#!/bin/bash
# daily_log_summary.sh

LOG_FILE="catalina.out"
DATE=$(date '+%Y-%m-%d')
YESTERDAY=$(date -d yesterday '+%Y-%m-%d')

echo "=== 일일 로그 요약 - $DATE ==="
echo

echo "📊 오늘 로그 통계:"
TODAY_LOGS=$(grep "$DATE" "$LOG_FILE" | wc -l)
echo " - 총 로그 라인: $TODAY_LOGS"

echo
echo "🚨 오늘 에러 현황:"
grep "$DATE" "$LOG_FILE" | grep -c ERROR | xargs echo " - ERROR: "
grep "$DATE" "$LOG_FILE" | grep -c WARN | xargs echo " - WARN: "

echo
echo "⏰ 시간대별 에러 분포:"
grep "$DATE" "$LOG_FILE" | grep ERROR | cut -d' ' -f2 | cut -d':' -f1 | sort | uniq -c

echo
echo "🔍 주요 에러 메시지 (상위 5개):"
grep "$DATE" "$LOG_FILE" | grep ERROR | cut -d' ' -f4- | sort | uniq -c | sort -nr | head -5

실시간 알림 스크립트

#!/bin/bash
# error_monitor.sh

LOG_FILE="catalina.out"
ALERT_KEYWORDS="FATAL|CRITICAL|ERROR"

tail -f "$LOG_FILE" | while read line; do
if echo "$line" | grep -qE "$ALERT_KEYWORDS"; then
echo "🚨 ALERT: $line"
# Slack, 이메일 등으로 알림 전송 가능
# curl -X POST -H 'Content-type: application/json' \
# --data "{\"text\":\"Error detected: $line\"}" \
# YOUR_SLACK_WEBHOOK_URL
fi
done

💡 추가 도구 활용

jq를 활용한 JSON 로그 분석

# JSON 로그 파일에서 에러만 추출
grep ERROR app.log | jq -r '.message'

# 특정 필드로 필터링
grep "$(date '+%Y-%m-%d')" app.log | jq -r 'select(.level=="ERROR") | .timestamp + " " + .message'

# 에러 레벨별 카운트
grep "$(date '+%Y-%m-%d')" app.log | jq -r '.level' | sort | uniq -c

awk를 활용한 고급 분석

# 시간대별 요청 수 분석
awk '{print $2}' access.log | cut -d':' -f1-2 | sort | uniq -c

# 응답 크기 통계
awk '{sum+=$7; count++} END {print "평균:", sum/count, "바이트"}' access.log

# 특정 조건의 로그만 처리
awk '/ERROR/ && /database/ {print $1, $2, $NF}' app.log

로그 분석 전용 도구들

lnav (Log Navigator):

# 설치
sudo apt install lnav

# 사용법
lnav catalina.out

goaccess (웹서버 로그 분석):

# 설치
sudo apt install goaccess

# Apache/Nginx 로그 분석
goaccess access.log -o report.html --log-format=COMBINED

multitail (여러 로그 동시 모니터링):

# 설치
sudo apt install multitail

# 여러 로그 파일 동시 모니터링
multitail app.log error.log access.log

🎯 상황별 완벽 가이드

상황 1: 서비스 장애 발생 시

1단계 - 즉시 현황 파악

# 실시간 에러 모니터링 시작
tail -f app.log | grep --color=always -E "(ERROR|FATAL|CRITICAL)"

2단계 - 장애 시점 특정

# 최근 1시간 에러 확인
grep "$(date '+%Y-%m-%d %H:')" app.log | grep ERROR

# 특정 시간대 집중 분석
grep "2024-09-23 14:[3-5][0-9]:" app.log | grep ERROR

3단계 - 에러 패턴 분석

# 에러 메시지별 빈도 확인
grep ERROR app.log | grep "$(date '+%Y-%m-%d')" | cut -d' ' -f4- | sort | uniq -c | sort -nr

# 에러 전후 상황 확인
grep -C 5 "FATAL" app.log | less

상황 2: 성능 저하 원인 분석

응답 시간 분석

# 느린 요청 찾기 (5초 이상)
grep "response_time" app.log | awk '$NF > 5000 {print}' | tail -20

# 시간대별 평균 응답 시간
grep "response_time" app.log | grep "$(date '+%Y-%m-%d')" |
awk '{hour=substr($2,1,2); sum[hour]+=$NF; count[hour]++}
END {for(h in sum) printf "%s시: %.2fms\n", h, sum[h]/count[h]}' | sort

리소스 사용량 분석

# 메모리 사용량 패턴
grep "memory" app.log | awk '{print $2, $NF}' | sort

# CPU 사용률 높은 시점
grep "cpu_usage" app.log | awk '$NF > 80 {print $1, $2, $NF}' | sort

상황 3: 보안 이벤트 분석

의심스러운 접근 패턴

# 실패한 로그인 시도
grep "login.*failed" auth.log | cut -d' ' -f1-3,9- | sort | uniq -c

# IP별 요청 빈도 (DDoS 의심)
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10

# 의심스러운 User-Agent
grep "User-Agent" access.log | cut -d'"' -f2 | sort | uniq -c | sort -nr

🔄 로그 관리 모범 사례

로그 회전 (Log Rotation) 설정

# /etc/logrotate.d/myapp 파일 생성
cat > /etc/logrotate.d/myapp << 'EOF'
/var/log/myapp/*.log {
daily # 매일 회전
rotate 30 # 30일간 보관
compress # 압축 저장
delaycompress # 하루 뒤 압축
missingok # 파일 없어도 에러 안남
notifempty # 빈 파일은 회전 안함
create 0644 myapp myapp # 새 파일 권한 설정
postrotate
systemctl reload myapp
endscript
}
EOF

로그 레벨 최적화

애플리케이션 로그 레벨 조정:

  • FATAL: 시스템 중단 수준
  • ERROR: 기능 실패, 즉시 대응 필요
  • WARN: 잠재적 문제, 모니터링 필요
  • INFO: 중요한 비즈니스 이벤트
  • DEBUG: 개발/테스트 환경에서만

구조화된 로그 형식

권장 로그 형식:

[2024-09-23 14:30:25.123] [ERROR] [user-service] [req-12345] User authentication failed: invalid token (user_id=1001, ip=192.168.1.100)

포함 요소:

  • 타임스탬프 (밀리초 포함)
  • 로그 레벨
  • 서비스/모듈명
  • 요청 ID (추적 가능)
  • 메시지 + 구조화된 데이터

📝 마무리

거대한 로그 파일 분석은 처음에는 어렵게 느껴지지만, 몇 가지 핵심 도구와 워크플로우를 익히면 효율적으로 할 수 있습니다.

핵심 도구 3가지만 기억하세요

  1. less: 전체 로그 탐색과 실시간 모니터링
  2. grep: 패턴 기반 검색과 필터링
  3. tail: 실시간 모니터링과 최근 로그 확인

상황별 추천 명령어

🚨 장애 대응:

tail -f app.log | grep --color=always ERROR

🔍 과거 분석:

less +/ERROR app.log

📊 패턴 분석:

grep "$(date '+%Y-%m-%d')" app.log | grep ERROR | cut -d' ' -f4- | sort | uniq -c

실무에서 바로 사용할 수 있는 팁

  • 멀티 터미널 활용: 실시간 모니터링 + 과거 분석 동시 진행
  • 시간 범위 제한: 먼저 시간대로 필터링 후 상세 분석
  • alias 설정: 자주 쓰는 명령어는 단축어로 등록
  • 스크립트 자동화: 반복적인 분석은 스크립트로 자동화

로그 분석이 더 이상 부담스럽지 않기를 바랍니다! 🚀