Linux 로그 분석 명령어 완벽 가이드 - 실무에서 바로 쓰는 필수 명령어 모음
Linux Log Analysis Commands Complete Guide - Essential Commands for Real-World Use
서론: 로그 분석, 왜 시스템 관리자의 핵심 역량인가
Linux 서버를 운영하다 보면, 장애가 발생했을 때 가장 먼저 확인하는 것이 바로 로그(Log)입니다. 로그는 시스템이 남기는 일종의 '블랙박스'로, 무엇이 언제 어떻게 발생했는지를 기록합니다. 보안 사고의 원인을 추적할 때도, 서비스 장애를 디버깅할 때도, 성능 병목을 찾을 때도 로그가 출발점입니다.
하지만 실제 운영 환경에서 로그 파일은 수 GB에서 수십 GB에 이를 수 있으며, 하루에 수백만 라인이 쌓이는 것도 드문 일이 아닙니다. 이 방대한 데이터에서 필요한 정보를 빠르고 정확하게 뽑아내는 능력이야말로 시스템 관리자와 DevOps 엔지니어의 핵심 역량입니다.
이 가이드에서는 Linux 로그 분석에 필요한 모든 핵심 명령어를 체계적으로 다룹니다. 기본 명령어부터 고급 원라이너까지, 실무에서 바로 복사해서 쓸 수 있는 실전 예제 중심으로 구성했습니다. 초급자부터 중급 이상의 실무자까지 모두 활용할 수 있도록 단계별로 설명합니다.
1. Linux 로그 시스템의 구조와 핵심 파일
1.1 로그 시스템의 아키텍처
Linux의 로그 시스템은 크게 두 가지 체계로 구분됩니다:
- 전통적 syslog 계열: rsyslog, syslog-ng 등이 텍스트 파일로 로그를 기록합니다.
/var/log/디렉토리 아래에 저장됩니다. - systemd-journald: systemd 기반 시스템에서 바이너리 형식으로 로그를 관리합니다.
journalctl명령어로 조회합니다.
대부분의 최신 배포판(RHEL 8+, Ubuntu 20.04+, Debian 11+)은 두 시스템을 병행하고 있습니다. journald가 1차로 수집하고, rsyslog가 이를 텍스트 파일로도 저장하는 구조입니다.
1.2 반드시 알아야 할 핵심 로그 파일
| 로그 파일 | 내용 | 주요 용도 |
|---|---|---|
/var/log/syslog |
시스템 전반의 메시지 (Debian/Ubuntu) | 일반 장애 분석 |
/var/log/messages |
시스템 전반의 메시지 (RHEL/CentOS) | 일반 장애 분석 |
/var/log/auth.log |
인증/로그인 관련 (Debian/Ubuntu) | 보안 분석, 침입 탐지 |
/var/log/secure |
인증/로그인 관련 (RHEL/CentOS) | 보안 분석, 침입 탐지 |
/var/log/kern.log |
커널 메시지 | 하드웨어, 드라이버 문제 |
/var/log/dmesg |
부팅 시 커널 메시지 | 부팅 문제, 하드웨어 감지 |
/var/log/cron |
cron 작업 실행 기록 | 스케줄 작업 디버깅 |
/var/log/maillog |
메일 서버 로그 | 메일 발송/수신 추적 |
/var/log/nginx/ |
Nginx 접속/에러 로그 | 웹 트래픽 분석 |
/var/log/apache2/ |
Apache 접속/에러 로그 | 웹 트래픽 분석 |
/var/log/mysql/ |
MySQL/MariaDB 로그 | DB 쿼리, 에러 분석 |
/var/log/audit/audit.log |
SELinux/AppArmor 감사 로그 | 보안 감사, 정책 위반 |
/var/log/boot.log |
서비스 부팅 로그 | 서비스 시작 실패 분석 |
/var/log/lastlog |
마지막 로그인 기록 (바이너리) | lastlog 명령으로 조회 |
/var/log/wtmp |
로그인/로그아웃 이력 (바이너리) | last 명령으로 조회 |
/var/log/btmp |
실패한 로그인 시도 (바이너리) | lastb 명령으로 조회 |
ls -la /var/log/로 먼저 어떤 로그 파일이 존재하는지 확인하는 습관을 들이세요.
1.3 로그 로테이션 이해하기
로그 파일은 logrotate에 의해 주기적으로 회전(rotation)됩니다. 이전 로그는 .1, .2 또는 .gz 확장자로 보관됩니다:
# 로그 로테이션 예시
/var/log/syslog # 현재 로그
/var/log/syslog.1 # 이전 로그 (비압축)
/var/log/syslog.2.gz # 그 이전 로그 (압축)
/var/log/syslog.3.gz # 더 이전 로그 (압축)
# 압축된 로그 파일 검색 시 zgrep, zcat 사용
zgrep "error" /var/log/syslog.2.gz
zcat /var/log/syslog.3.gz | grep "kernel"
# logrotate 설정 확인
cat /etc/logrotate.conf
ls /etc/logrotate.d/
2. 기본 로그 조회 명령어
2.1 tail - 실시간 로그 모니터링의 시작
tail은 로그 분석의 가장 기본이자 가장 많이 사용되는 명령어입니다. 특히 -f 옵션은 실시간 모니터링의 핵심입니다.
# 마지막 10줄 보기 (기본값)
tail /var/log/syslog
# 마지막 50줄 보기
tail -n 50 /var/log/syslog
tail -50 /var/log/syslog # 축약형
# 실시간 로그 모니터링 (follow)
tail -f /var/log/syslog
# 실시간 + 최근 100줄부터 보기
tail -n 100 -f /var/log/syslog
tail -100f /var/log/syslog # 축약형
# 여러 파일 동시 모니터링
tail -f /var/log/syslog /var/log/auth.log
# 파일이 교체(rotate)되어도 계속 추적
tail -F /var/log/syslog # 대문자 -F: 파일 재오픈
# 특정 키워드만 실시간 필터링
tail -f /var/log/syslog | grep --line-buffered "error"
tail -f /var/log/syslog | grep --line-buffered -i "fail\|error\|warn"
tail -f와 grep을 파이프로 연결할 때는 반드시 --line-buffered 옵션을 사용하세요. 그렇지 않으면 버퍼링으로 인해 출력이 지연될 수 있습니다.
2.2 head - 파일 앞부분 확인
# 처음 10줄 보기 (기본값)
head /var/log/syslog
# 처음 30줄 보기
head -n 30 /var/log/syslog
# 마지막 10줄을 제외한 전체
head -n -10 /var/log/syslog
2.3 cat, less, more - 파일 전체 조회
# 파일 전체 출력 (작은 파일에만 적합)
cat /var/log/cron
# 행 번호와 함께 출력
cat -n /var/log/cron
# 페이지 단위로 탐색 (가장 추천)
less /var/log/syslog
# less 내부 단축키:
# / : 앞으로 검색
# ? : 뒤로 검색
# n : 다음 검색 결과
# N : 이전 검색 결과
# G : 파일 끝으로 이동
# g : 파일 처음으로 이동
# q : 종료
# less에서 실시간 모니터링 (tail -f와 유사)
less +F /var/log/syslog
# Ctrl+C로 탐색 모드 전환, Shift+F로 다시 추적 모드
cat 대신 반드시 less를 사용하세요. cat은 파일 전체를 메모리에 로드하므로 수 GB 파일에서는 시스템에 부하를 줄 수 있습니다.
2.4 wc - 로그 통계 빠르게 확인
# 총 라인 수 확인
wc -l /var/log/syslog
# 오늘 에러가 몇 건인지 빠르게 파악
grep -c "error" /var/log/syslog
grep -ci "error\|fail\|critical" /var/log/syslog
# 여러 로그 파일의 라인 수 비교
wc -l /var/log/syslog /var/log/auth.log /var/log/kern.log
3. grep - 로그 검색의 핵심 무기
grep은 로그 분석에서 가장 중요한 명령어라고 해도 과언이 아닙니다. 문자열 패턴 매칭을 통해 방대한 로그에서 필요한 정보만 빠르게 추출합니다.
3.1 기본 검색
# 특정 문자열 검색
grep "error" /var/log/syslog
# 대소문자 무시 검색
grep -i "error" /var/log/syslog
# 행 번호 표시
grep -n "error" /var/log/syslog
# 매칭된 건수만 표시
grep -c "error" /var/log/syslog
# 해당 문자열이 없는 줄만 표시 (역매칭)
grep -v "info" /var/log/syslog
# 완전 단어 매칭 (error는 매칭, errorlog는 미매칭)
grep -w "error" /var/log/syslog
3.2 정규 표현식을 활용한 고급 검색
# 확장 정규표현식 사용 (-E 또는 egrep)
grep -E "error|fail|critical" /var/log/syslog
# IP 주소 패턴 검색
grep -E "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" /var/log/auth.log
# 특정 시간대 로그 필터링 (예: 오전 3시대)
grep "^Mar 7 03:" /var/log/syslog
# 날짜 + 시간 범위 (2시~5시)
grep -E "^Mar 7 0[2-5]:" /var/log/syslog
# SSH 실패 로그인 추출
grep "Failed password" /var/log/auth.log
# 특정 사용자의 sudo 명령 추적
grep "sudo.*username" /var/log/auth.log
3.3 컨텍스트 검색 - 에러 전후 상황 파악
# 매칭 라인 이후 5줄 표시 (After)
grep -A 5 "kernel panic" /var/log/kern.log
# 매칭 라인 이전 3줄 표시 (Before)
grep -B 3 "OOM" /var/log/syslog
# 전후 각 5줄씩 표시 (Context)
grep -C 5 "segfault" /var/log/syslog
# 복합 조건: error이면서 nginx 관련
grep "error" /var/log/syslog | grep "nginx"
# 여러 파일에서 동시 검색
grep -r "connection refused" /var/log/
grep -rl "connection refused" /var/log/ # 파일명만 출력
3.4 압축 로그에서 검색
# gz 압축 파일에서 직접 검색
zgrep "error" /var/log/syslog.2.gz
# 압축 파일 내용 확인
zcat /var/log/syslog.2.gz | less
# 현재 + 과거 로그 모두 검색
zgrep "error" /var/log/syslog /var/log/syslog.1 /var/log/syslog.*.gz
4. awk - 로그 데이터 추출과 가공의 강자
awk는 텍스트를 필드 단위로 분리하고 가공하는 데 최적화된 도구입니다. 로그의 특정 컬럼만 추출하거나, 조건별 집계를 할 때 매우 강력합니다.
4.1 기본 필드 추출
# syslog 형식: 날짜 호스트 프로세스: 메시지
# $1=월, $2=일, $3=시각, $4=호스트, $5=프로세스
# 시간과 메시지만 추출
awk '{print $3, $5, $0}' /var/log/syslog | tail -20
# 특정 필드만 출력 (Nginx access log 예시)
# 형식: IP - - [날짜] "요청" 상태코드 크기 "리퍼러" "UA"
awk '{print $1, $9}' /var/log/nginx/access.log # IP와 상태코드
# 탭 구분 파일 처리
awk -F'\t' '{print $1, $3}' logfile.tsv
# 콤마 구분 (CSV)
awk -F',' '{print $1, $NF}' logfile.csv # 첫 번째와 마지막 필드
4.2 조건부 필터링
# HTTP 500 에러만 추출 (Nginx/Apache)
awk '$9 == 500' /var/log/nginx/access.log
# 500번대 에러 모두
awk '$9 >= 500 && $9 < 600' /var/log/nginx/access.log
# 응답 크기 1MB 이상만
awk '$10 > 1048576' /var/log/nginx/access.log
# 특정 IP의 요청만
awk '$1 == "192.168.1.100"' /var/log/nginx/access.log
# 특정 문자열 포함 라인 (grep과 유사)
awk '/error/' /var/log/syslog
awk '/error/ && /nginx/' /var/log/syslog # AND 조건
awk '/error/ || /warn/' /var/log/syslog # OR 조건
4.3 집계와 통계
# IP별 요청 횟수 집계 (Top 접속 IP)
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
# awk만으로 IP 카운팅
awk '{ip[$1]++} END {for (i in ip) print ip[i], i}' /var/log/nginx/access.log | sort -rn | head -20
# 상태코드별 건수
awk '{code[$9]++} END {for (c in code) print c, code[c]}' /var/log/nginx/access.log | sort -k2 -rn
# 시간대별 요청 건수 (시 단위)
awk '{split($4, a, ":"); hour=a[2]; h[hour]++} END {for (i in h) print i, h[i]}' /var/log/nginx/access.log | sort
# 총 전송 바이트 합산
awk '{sum += $10} END {printf "Total: %.2f GB\n", sum/1024/1024/1024}' /var/log/nginx/access.log
# URL 경로별 요청 수 (GET/POST 구분 없이)
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -30
4.4 실전 원라이너
# 느린 요청 찾기 (응답시간 포함 로그 형식 가정)
# log_format에 $request_time이 마지막 필드라면:
awk '{if ($NF > 3.0) print $0}' /var/log/nginx/access.log
# 분당 요청 수 계산
awk '{split($4,a,"[:/]"); min=a[2]":"a[3]":"a[4]" "a[5]":"a[6]; m[min]++} END {for (i in m) print i, m[i]}' /var/log/nginx/access.log | sort | tail -20
# 에러율 계산
awk '{total++; if ($9 >= 400) errors++} END {printf "Total: %d, Errors: %d, Rate: %.2f%%\n", total, errors, (errors/total)*100}' /var/log/nginx/access.log
5. sed - 로그 텍스트 변환과 추출
sed는 스트림 에디터로, 로그 데이터를 변환하거나 특정 범위를 추출할 때 유용합니다.
5.1 기본 패턴 치환과 추출
# 특정 문자열 치환 (출력용)
sed 's/error/ERROR/gi' /var/log/syslog | head
# 특정 범위의 라인만 출력
sed -n '100,200p' /var/log/syslog # 100~200번째 줄
# 특정 패턴 사이의 내용만 추출
sed -n '/Start of backup/,/End of backup/p' /var/log/syslog
# 특정 시간 범위 추출
sed -n '/Mar 7 14:00/,/Mar 7 15:00/p' /var/log/syslog
# 빈 줄 제거
sed '/^$/d' /var/log/application.log
# 주석(#) 줄 제거
sed '/^#/d' /etc/rsyslog.conf
# IP 주소를 마스킹 (보안 보고서용)
sed -E 's/([0-9]+\.[0-9]+\.[0-9]+\.)[0-9]+/\1***/g' /var/log/auth.log
5.2 다중 명령과 고급 활용
# 여러 치환을 한번에
sed -e 's/error/ERROR/gi' -e 's/warning/WARNING/gi' /var/log/syslog
# 특정 라인 삭제 (1~5번째 줄 제외하고 출력)
sed '1,5d' /var/log/syslog
# 날짜 형식 변환 예시
echo "2026/03/07 14:30:00" | sed 's|\([0-9]*\)/\([0-9]*\)/\([0-9]*\)|\1-\2-\3|'
# 특정 패턴이 포함된 줄만 출력 (grep과 유사)
sed -n '/OOM/p' /var/log/syslog
6. sort, uniq, cut - 로그 데이터 정렬과 집계
이 세 명령어는 단독으로도 유용하지만, 파이프라인으로 조합할 때 진정한 위력을 발휘합니다.
6.1 sort - 정렬
# 기본 정렬 (알파벳 순)
sort /var/log/auth.log
# 역순 정렬
sort -r /var/log/auth.log
# 숫자 기준 정렬
sort -n data.log
# 특정 필드 기준 정렬 (3번째 필드, 숫자 역순)
sort -t' ' -k3 -rn access.log
# 날짜 기준 정렬
sort -k1,1M -k2,2n /var/log/syslog # 월(Month) + 일(숫자)
6.2 uniq - 중복 제거와 카운팅
# 중복 제거 (반드시 sort와 함께!)
sort /var/log/auth.log | uniq
# 중복 건수 표시
sort /var/log/auth.log | uniq -c
# 중복 건수로 재정렬 (빈도순)
sort /var/log/auth.log | uniq -c | sort -rn
# 중복된 줄만 표시
sort /var/log/auth.log | uniq -d
# 고유한 줄만 표시 (1회만 등장)
sort /var/log/auth.log | uniq -u
uniq은 연속된 중복만 제거합니다. 반드시 sort를 먼저 실행한 후 uniq을 사용해야 올바른 결과를 얻을 수 있습니다.
6.3 cut - 필드 잘라내기
# 특정 구분자 기준으로 필드 추출
cut -d' ' -f1 /var/log/nginx/access.log # IP만 추출
cut -d':' -f1 /etc/passwd # 사용자명만
# 문자 위치 기준 추출
cut -c1-15 /var/log/syslog # 앞 15자 (날짜 시간)
# 여러 필드 동시 추출
cut -d' ' -f1,4,7 /var/log/nginx/access.log # 1, 4, 7번째 필드
6.4 조합 파이프라인 실전 예제
# SSH 실패 로그인 IP Top 10
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -10
# 시간대별 에러 건수
grep -i "error" /var/log/syslog | awk '{print $3}' | cut -d: -f1 | sort | uniq -c | sort -rn
# Nginx 요청 URL Top 20
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
# 접속한 고유 IP 수
awk '{print $1}' /var/log/nginx/access.log | sort -u | wc -l
# 날짜별 로그 라인 수 추이
awk '{print $1, $2}' /var/log/syslog | sort | uniq -c
7. journalctl - systemd 로그 분석의 모든 것
systemd 기반 시스템에서 journalctl은 가장 강력한 로그 조회 도구입니다. 바이너리 저널을 구조화된 형태로 조회하며, 다양한 필터링을 기본 지원합니다.
7.1 기본 조회
# 전체 저널 보기
journalctl
# 최신 로그부터 역순으로 보기
journalctl -r
# 최근 50줄만 보기
journalctl -n 50
# 실시간 모니터링 (tail -f와 동일)
journalctl -f
# 특정 부팅 세션의 로그
journalctl -b # 현재 부팅
journalctl -b -1 # 이전 부팅
journalctl --list-boots # 부팅 이력 목록
# 페이저 없이 출력 (스크립트용)
journalctl --no-pager
7.2 시간 기반 필터링
# 특정 날짜 이후
journalctl --since "2026-03-07"
# 특정 시간 범위
journalctl --since "2026-03-07 14:00" --until "2026-03-07 16:00"
# 상대 시간
journalctl --since "1 hour ago"
journalctl --since "30 min ago"
journalctl --since "2 days ago"
journalctl --since yesterday
journalctl --since today
7.3 서비스/유닛 기반 필터링
# 특정 서비스 로그만 보기
journalctl -u nginx.service
journalctl -u sshd.service
journalctl -u mysql.service
# 여러 서비스 동시 조회
journalctl -u nginx.service -u php-fpm.service
# 특정 서비스 실시간 모니터링
journalctl -u nginx.service -f
# 특정 서비스의 최근 에러만
journalctl -u nginx.service -p err -n 50
7.4 우선순위(심각도) 필터링
# 심각도 수준별 필터링
# 0=emerg, 1=alert, 2=crit, 3=err, 4=warning, 5=notice, 6=info, 7=debug
journalctl -p emerg # 긴급 (시스템 사용 불가)
journalctl -p alert # 즉각 조치 필요
journalctl -p crit # 치명적 상태
journalctl -p err # 에러 (가장 많이 사용)
journalctl -p warning # 경고
# 범위 지정 (crit 이상의 심각한 로그만)
journalctl -p crit..emerg
# 서비스 + 심각도 + 시간 조합
journalctl -u sshd.service -p err --since "1 hour ago"
7.5 출력 형식 제어
# JSON 형식 출력 (파싱에 유용)
journalctl -u nginx.service -o json-pretty -n 5
# 간결한 한 줄 형식
journalctl -o short-precise
# 사용 가능한 출력 형식
# short : 기본 syslog 스타일
# short-precise : 마이크로초 단위 시간
# short-iso : ISO 8601 형식 시간
# verbose : 모든 필드 표시
# json : JSON 형식 (한 줄)
# json-pretty : JSON 형식 (들여쓰기)
# cat : 메시지만 (타임스탬프 없이)
# 특정 필드 기반 필터링
journalctl _COMM=sshd # 프로세스명
journalctl _PID=1234 # PID
journalctl _UID=0 # root 사용자
journalctl _HOSTNAME=webserver01 # 호스트명
7.6 커널 로그와 디스크 사용량
# 커널 메시지만 (dmesg와 유사)
journalctl -k
journalctl --dmesg
# 저널 디스크 사용량 확인
journalctl --disk-usage
# 저널 정리 (오래된 로그 삭제)
sudo journalctl --vacuum-time=7d # 7일 이상 된 로그 삭제
sudo journalctl --vacuum-size=500M # 500MB 초과분 삭제
8. 실전 시나리오별 로그 분석
8.1 SSH 무차별 대입 공격 분석
# 실패한 SSH 로그인 시도 확인
grep "Failed password" /var/log/auth.log | tail -20
# 공격 IP 추출 및 빈도 정렬
grep "Failed password" /var/log/auth.log | \
awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -20
# 특정 IP의 시도 시간대 분석
grep "Failed password" /var/log/auth.log | \
grep "192.168.1.100" | awk '{print $1, $2, $3}'
# 성공한 로그인 확인
grep "Accepted" /var/log/auth.log | tail -20
# 비정상적인 사용자명으로 시도한 공격
grep "Invalid user" /var/log/auth.log | \
awk '{print $8}' | sort | uniq -c | sort -rn | head -20
# 시간대별 공격 빈도 (시간 단위)
grep "Failed password" /var/log/auth.log | \
awk '{print $3}' | cut -d: -f1 | sort | uniq -c | sort -rn
# journalctl로 SSH 분석
journalctl -u sshd.service -p warning --since "24 hours ago" --no-pager
8.2 웹 서버 장애 분석 (Nginx/Apache)
# 500 에러 발생 시점 파악
grep '" 500 ' /var/log/nginx/access.log | tail -30
# 5xx 에러 비율 계산
awk '{total++; if ($9 ~ /^5/) err++} END {printf "Total: %d, 5xx: %d (%.2f%%)\n", total, err, err/total*100}' \
/var/log/nginx/access.log
# 에러 발생 URL 패턴 분석
grep '" 500 ' /var/log/nginx/access.log | \
awk '{print $7}' | sort | uniq -c | sort -rn | head -20
# Nginx 에러 로그 분석
grep "error" /var/log/nginx/error.log | tail -30
# upstream 타임아웃 확인
grep "upstream timed out" /var/log/nginx/error.log | wc -l
# 초당 요청 수 (RPS) 계산
awk '{split($4,a,"[:/]"); sec=a[4]" "a[5]":"a[6]":"a[7]; s[sec]++} END {for (i in s) print i, s[i]}' \
/var/log/nginx/access.log | sort | tail -20
# 특정 시간대의 느린 요청 (request_time이 마지막 필드)
awk '$NF > 5.0 {print $4, $7, $NF}' /var/log/nginx/access.log | tail -20
8.3 디스크 I/O 및 OOM (Out of Memory) 분석
# OOM Killer가 프로세스를 종료한 이력 확인
grep -i "oom" /var/log/syslog
grep "Out of memory" /var/log/syslog
dmesg | grep -i "oom"
# OOM으로 종료된 프로세스 목록
grep "Killed process" /var/log/syslog | \
awk -F'[()]' '{print $2}' | sort | uniq -c | sort -rn
# journalctl로 OOM 확인
journalctl -k | grep -i "oom"
journalctl -k | grep "Out of memory"
# 디스크 관련 에러
grep -i "I/O error" /var/log/syslog
grep -i "ext4.*error" /var/log/syslog
dmesg | grep -i "error"
# 파일시스템 읽기 전용 전환 감지
grep "Remounting filesystem read-only" /var/log/syslog
8.4 서비스 시작/중지/크래시 추적
# 서비스 시작/중지 이력
journalctl -u nginx.service | grep -i "started\|stopped\|failed"
# 서비스 실패 원인 분석
systemctl status nginx.service
journalctl -u nginx.service --since "10 min ago" -p err
# 서비스 재시작 빈도 분석
journalctl -u mysql.service | grep -c "Started"
# 코어 덤프 확인
journalctl | grep "core dump"
coredumpctl list # systemd-coredump 사용 시
# 부팅 실패 서비스 목록
systemctl --failed
8.5 cron 작업 디버깅
# cron 실행 이력 확인
grep CRON /var/log/syslog
grep CRON /var/log/cron # RHEL/CentOS
# 특정 사용자의 cron 실행 확인
grep "CRON.*username" /var/log/syslog
# cron 에러만 확인
grep CRON /var/log/syslog | grep -i "error\|fail"
# journalctl로 cron 확인
journalctl -u cron.service --since today
# 특정 스크립트의 cron 실행 확인
grep "backup.sh" /var/log/syslog
9. 고급 분석 기법과 원라이너 모음
9.1 xargs와 find를 활용한 다중 파일 분석
# 최근 24시간 이내 수정된 로그 파일에서 error 검색
find /var/log -name "*.log" -mtime -1 -exec grep -l "error" {} \;
# 모든 로그 파일에서 특정 IP 검색
find /var/log -type f -name "*.log" | xargs grep -l "192.168.1.100" 2>/dev/null
# 특정 크기 이상의 로그 파일 찾기
find /var/log -type f -size +100M -exec ls -lh {} \;
# 오래된 로그 파일 정리 (30일 이상)
find /var/log -name "*.gz" -mtime +30 -exec ls -la {} \;
9.2 while read 루프로 라인별 처리
# 실패 IP를 하나씩 처리 (예: 차단 목록 생성)
grep "Failed password" /var/log/auth.log | \
awk '{print $(NF-3)}' | sort -u | \
while read ip; do
count=$(grep -c "$ip" /var/log/auth.log)
echo "$ip: $count attempts"
done
# 특정 에러 패턴 발생 시 알림
tail -f /var/log/syslog | while read line; do
echo "$line" | grep -q "CRITICAL" && echo "ALERT: $line" >> /tmp/alerts.log
done
9.3 date 명령과 연계한 시간 기반 분석
# 최근 1시간 로그만 추출 (syslog 형식)
SINCE=$(date -d '1 hour ago' '+%b %e %H')
awk -v since="$SINCE" '$0 >= since' /var/log/syslog
# 어제 날짜 로그 검색
YESTERDAY=$(date -d yesterday '+%b %e')
grep "^$YESTERDAY" /var/log/syslog
# 분 단위 요청 수 추이 (최근 1시간)
awk '{print substr($4,14,5)}' /var/log/nginx/access.log | sort | uniq -c | tail -60
9.4 실무 즐겨찾기 원라이너 베스트
# === 보안 분석 ===
# 1. SSH 무차별 공격 IP Top 10 + GeoIP 없이 빈도 분석
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -10
# 2. 현재 접속 중인 SSH 세션
who | grep pts
ss -tnp | grep :22
# 3. sudo 명령어 사용 이력
grep "COMMAND" /var/log/auth.log | awk -F: '{print $NF}' | sort | uniq -c | sort -rn | head -20
# 4. 비정상 포트 접속 시도
grep "refused connect" /var/log/syslog | awk '{print $NF}' | sort | uniq -c | sort -rn
# === 성능 분석 ===
# 5. Nginx 응답코드 분포
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
# 6. 시간대별 트래픽 (시 단위)
awk '{split($4,a,":"); print a[2]":00"}' /var/log/nginx/access.log | sort | uniq -c
# 7. 가장 큰 응답을 생성한 URL
awk '{print $10, $7}' /var/log/nginx/access.log | sort -rn | head -20
# 8. 대역폭 사용량 계산 (일 단위)
awk '{sum+=$10} END {printf "%.2f GB\n", sum/1024/1024/1024}' /var/log/nginx/access.log
# === 장애 분석 ===
# 9. 최근 에러 로그 종합 (중복 제거, 빈도순)
grep -i "error\|fail\|critical\|fatal" /var/log/syslog | \
sed 's/^.*\] //' | sort | uniq -c | sort -rn | head -30
# 10. 서비스별 재시작 빈도
journalctl --since "7 days ago" | grep "Started" | \
awk '{for(i=5;i<=NF;i++) printf $i" "; print ""}' | sort | uniq -c | sort -rn | head -20
# 11. 커널 패닉/OOPS 확인
journalctl -k -p crit --since "7 days ago"
dmesg -T | grep -i "panic\|oops\|bug\|error"
# 12. 디스크 풀 경고 관련 로그
grep -i "no space\|disk full\|ENOSPC" /var/log/syslog
10. 로그 모니터링 자동화
10.1 간단한 로그 감시 스크립트
#!/bin/bash
# log_monitor.sh - 로그 감시 및 알림 스크립트
LOG_FILE="/var/log/syslog"
ALERT_PATTERNS="error|critical|fatal|panic|OOM|segfault"
ALERT_LOG="/var/log/alert_monitor.log"
CHECK_INTERVAL=60
echo "[$(date)] Log monitor started for $LOG_FILE" | tee -a "$ALERT_LOG"
tail -Fn0 "$LOG_FILE" | while read line; do
if echo "$line" | grep -qiE "$ALERT_PATTERNS"; then
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$TIMESTAMP] ALERT: $line" | tee -a "$ALERT_LOG"
# 여기에 알림 추가 (메일, Slack 등)
# echo "$line" | mail -s "Log Alert" admin@example.com
fi
done
10.2 logwatch를 활용한 일일 리포트
# logwatch 설치
sudo apt install logwatch # Debian/Ubuntu
sudo yum install logwatch # RHEL/CentOS
# 일일 리포트 생성
logwatch --detail High --range today --output stdout
# 메일로 발송
logwatch --detail High --range yesterday --mailto admin@example.com --format html
# 특정 서비스만 분석
logwatch --service sshd --detail High --range today
10.3 multitail - 멀티 로그 실시간 모니터링
# multitail 설치
sudo apt install multitail
# 여러 로그 동시 모니터링 (화면 분할)
multitail /var/log/syslog /var/log/auth.log
# 색상 하이라이팅 + 필터
multitail -ci green /var/log/nginx/access.log -ci red /var/log/nginx/error.log
# 컬러 스킴과 필터 적용
multitail -e "error" /var/log/syslog -e "Failed" /var/log/auth.log
10.4 lnav - 구조화된 로그 분석기
# lnav 설치
sudo apt install lnav
# 기본 사용 (자동 형식 감지)
lnav /var/log/syslog
# 여러 파일 동시 분석
lnav /var/log/syslog /var/log/auth.log
# lnav 내부에서 SQL 쿼리 사용
# ;SELECT log_time, log_body FROM syslog_log WHERE log_body LIKE '%error%' LIMIT 20
# 압축 파일도 자동 지원
lnav /var/log/syslog.*.gz
lnav은 로그 형식을 자동 감지하고, 색상 구분, 타임라인, 히스토그램, SQL 쿼리까지 지원하는 매우 강력한 터미널 기반 로그 분석기입니다. 터미널에서 오래 로그를 분석해야 할 때 최고의 선택입니다.
11. 로그 분석 베스트 프랙티스
11.1 효율적인 로그 분석 습관
- 큰 그림부터 시작하라:
wc -l로 규모 파악 →grep -c로 에러 빈도 확인 → 세부 분석 진행 - 시간 범위를 좁혀라: 장애 발생 시점 전후로 범위를 좁혀 분석하면 불필요한 노이즈를 줄일 수 있습니다.
- 파이프라인을 단계적으로 구축하라: 한 번에 복잡한 원라이너를 작성하지 말고, 파이프를 하나씩 추가하며 결과를 확인하세요.
- alias를 활용하라: 자주 쓰는 로그 분석 명령을
~/.bashrc에 alias로 등록해두면 효율이 올라갑니다. - tee로 중간 결과를 저장하라:
command | tee /tmp/result.txt | next_command로 중간 결과를 파일로 보관하면서 파이프라인을 이어갈 수 있습니다.
11.2 유용한 bash alias 설정
# ~/.bashrc에 추가할 로그 분석 alias
alias syslog='tail -f /var/log/syslog'
alias authlog='tail -f /var/log/auth.log'
alias nginxlog='tail -f /var/log/nginx/access.log'
alias nginxerr='tail -f /var/log/nginx/error.log'
alias logerror='grep -i "error\|fail\|critical" /var/log/syslog | tail -50'
alias sshfail='grep "Failed password" /var/log/auth.log | awk '\''{print $(NF-3)}'\'' | sort | uniq -c | sort -rn | head -20'
alias topip='awk '\''{print $1}'\'' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20'
alias jlog='journalctl -f'
alias jerr='journalctl -p err --since "1 hour ago" --no-pager'
11.3 보안 주의사항
- 로그 파일 권한 관리: 로그 파일에는 민감 정보(IP, 사용자명, 쿼리 파라미터)가 포함될 수 있으므로 적절한 권한(640 이하)을 설정하세요.
- 로그 무결성 보호: 침입자가 로그를 삭제/변조할 수 있으므로, 중요 서버는 원격 로그 수집(rsyslog 원격 전송, ELK, Loki 등)을 병행하세요.
- 로그 보존 정책: 법적 요구사항과 디스크 용량을 고려하여
logrotate와 보존 기간을 적절히 설정하세요. - 개인정보 주의: 로그에 포함된 개인정보(IP, 이메일 등)는 개인정보보호법에 따라 적절히 관리해야 합니다.
12. 명령어 빠른 참조 치트시트
| 목적 | 명령어 |
|---|---|
| 실시간 모니터링 | tail -f /var/log/syslog |
| 키워드 실시간 필터 | tail -f /var/log/syslog | grep --line-buffered "error" |
| 에러 건수 확인 | grep -ci "error" /var/log/syslog |
| 에러 전후 문맥 | grep -C 5 "error" /var/log/syslog |
| IP별 접속 횟수 | awk '{print $1}' access.log | sort | uniq -c | sort -rn |
| HTTP 상태코드 분포 | awk '{print $9}' access.log | sort | uniq -c | sort -rn |
| SSH 공격 IP | grep "Failed password" auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn |
| 시간대별 에러 | grep "error" syslog | awk '{print $3}' | cut -d: -f1 | sort | uniq -c |
| 서비스 로그 | journalctl -u nginx.service -p err --since "1h ago" |
| 커널 에러 | journalctl -k -p err |
| OOM 확인 | dmesg -T | grep -i "oom\|killed process" |
| 디스크 에러 | grep -i "I/O error\|read-only" /var/log/syslog |
| 압축 로그 검색 | zgrep "error" /var/log/syslog.*.gz |
| 로그 라인 수 | wc -l /var/log/syslog |
| 저널 디스크 사용량 | journalctl --disk-usage |
결론: 로그 분석은 실전 감각이 핵심
Linux 로그 분석은 도구와 명령어를 아는 것만으로는 충분하지 않습니다. 실제 장애 상황에서 어떤 로그 파일을 먼저 확인할지, 어떤 패턴으로 필터링할지, 결과를 어떻게 해석할지에 대한 실전 감각이 가장 중요합니다.
이 가이드에서 다룬 명령어들을 자신의 서버 환경에서 직접 실행해 보세요. grep과 awk의 조합, journalctl의 다양한 필터링 옵션, sort | uniq -c | sort -rn 파이프라인은 한번 손에 익으면 어떤 로그 분석 상황에서든 빠르게 대응할 수 있는 무기가 됩니다.
특히 기억해야 할 핵심 원칙은 다음과 같습니다:
- 항상 시간 범위를 좁혀서 시작하라 - 전체 로그를 뒤지지 말고, 장애 시점 전후로 집중하세요.
- 파이프라인을 단계적으로 구축하라 - 한 단계씩 결과를 확인하며 명령을 추가하세요.
- 자주 쓰는 명령은 alias로 저장하라 - 긴급 상황에서 명령어를 기억해내는 것보다 alias를 치는 것이 빠릅니다.
- 원격 로그 수집을 병행하라 - 로컬 로그만으로는 보안과 가용성을 보장할 수 없습니다.
- 정기적으로 로그를 점검하라 - 장애가 터진 후에야 로그를 보는 것이 아니라, 평소에도 로그 추이를 모니터링하는 습관이 중요합니다.
로그 분석 능력은 시스템 관리자, DevOps 엔지니어, SRE, 보안 엔지니어 모두에게 필수적인 역량입니다. 오늘 배운 명령어들을 바로 터미널에서 실행해 보면서 자신만의 분석 루틴을 만들어 보시기 바랍니다.