════════════════════
Ch1. 로그(Log)란?
════════════════════
• 로그 = 시스템·앱·네트워크장비 등이 동작하면서 만들어내는 시간순서(Timestamp) 기반의 이벤트기록. 컴퓨터가 “언제 무슨일을 했다”는 일기를 자동으로 쓰는것
• 활용분야: 침해탐지(비정상접속,권한상승시도) / 사고대응(공격경로·타임라인재구성) / 법적증거(법원제출가능한 디지털증거) / 컴플라이언스(ISO27001,ISMS-P등) / 성능모니터링(장애원인분석)
• 리눅스 로깅시스템 두가지
커널로깅(Kernel Logging): 커널영역에서 발생, 하드웨어오류·경고등 커널메시지, 부팅초기부터 기록, dmesg명령으로 확인
사용자로깅(User Logging): 사용자영역에서 발생, 사용자프로세스·서비스로그, syslog프로토콜기반, rsyslog/journald가 수집
• 커널 링버퍼와 dmesg: 커널은 로그를 링버퍼(원형메모리구조)에 저장. CCTV처럼 꽉차면 오래된것 지워짐. 재부팅하면 사라짐
printk()(커널내부로그함수) → Ring Buffer(원형메모리) → /dev/kmsg(가상장치) → dmesg명령어(사용자확인)
또한 /proc/kmsg를 통해 rsyslog(imklog모듈)가 읽어서 /var/log/kern.log에 저장
주요명령어: sudo dmesg | tail -20(최근20개) / sudo dmesg -wT(실시간+타임스탬프) / sudo dmesg -T -l err(err레벨필터+타임스탬프) / sudo dmesg -wT -l err,crit,alert,emerg(실시간+심각레벨만) / sudo dmesg -wT | grep -i “usb|disk|oom|fail”
• 사용자 로그처리흐름: 서비스/앱(stdout/stderr/dev/log) → systemd-journald(1차수집,이진형태로 수집) → rsyslogd(분류·저장) → 파일저장(/var/log/*.log)
journald가 먼저 모든로그를 바이너리로 수집 → rsyslog가 텍스트파일로 분류저장
• 주요 로그파일 위치(/var/log)
syslog(일반시스템메시지,rsyslog) / auth.log(인증·권한이벤트,rsyslog,사용자로그인,인증을 직접처리하는 데몬) / kern.log(커널메시지,rsyslog) / cron.log(크론작업기록,crond) / dmesg(부팅시 커널링버퍼메시지,kernel) / wtmp(로그인기록,last명령조회,sshd/login) / btmp(실패한로그인,lastb명령조회) / mail.log(메일시스템) / /run/log/journal/(journald임시로그,재부팅시삭제)
• dmesg vs kern.log vs syslog 비교
기록범위: dmesg·kern.log는 커널만, syslog는 커널+전체
저장위치: dmesg는 커널메모리, 나머지는 디스크파일
재부팅후: dmesg는 사라짐, 나머지는 유지
실시간조회: dmesg -w / tail -f / tail -f
• 핵심포인트: 로그=자동일기장 / 커널로그→dmesg확인,재부팅시사라짐 / 사용자로그→/var/log/에 텍스트저장 / syslog→텍스트파일저장(/var/log/syslog) / systemd-journal→이진데이터,읽기·검색 X저장X, journalctl 명령어사용
════════════════════
Ch2. syslog 프로토콜
════════════════════
• syslog = 로그메시지를 생성·전달·수집하는 표준프로토콜. Facility(출처)와 Severity(심각도) 두가지 개념으로 분류
• Facility(로그출처번호): 0 kern(커널메시지) / 1 user(사용자프로세스) / 2 mail(메일시스템) / 3 daemon(시스템데몬) / 4 auth(인증메시지,ssh·sudo·login) / 9 cron(크론데몬) / 16~23 local0~7(사용자정의)
• Severity(심각도레벨): 0 Emergency/emerg(시스템사용불가,커널패닉,가장심각) / 1 Alert/alert(즉시조치필요) / 2 Critical/crit(심각한HW오류) / 3 Error/err(오류조건) / 4 Warning/warning(경고,디스크90%등) / 5 Notice/notice(정상이지만주목할이벤트) / 6 Info/info(일반정보) / 7 Debug/debug(개발용,가장낮음)
• PRI(Priority) 계산법: Priority = Facility × 8 + Severity
예) auth.crit: 4×8+2=<34> / auth.err: 4×8+3=<35> / kern.emerg: 0×8+0=<0> / local0.info: 16×8+6=<134>
• syslog 메시지포맷(RFC 5424): VERSION TIMESTAMP HOSTNAME APP-NAME PROCID MSGID [SD] MSG
예) <34>1 2024-03-15T10:23:45.123Z web01 nginx 1234 - [meta sequenceId=“15”] Password authentication failed for user admin
<34>=PRI(번호<심각도>) / 1=VERSION / 2024..=TIMESTAMP(ISO8601) / web01=HOSTNAME / nginx=APP-NAME / 1234=PROCID(프로세스ID) / -=MSGID(없으면-) / [meta]=SD(구조화데이터,키-값형태) / Password..=MSG(실제 로그메시지)
• logger 명령어: 커맨드라인에서 직접 syslog API를 호출해 로그남기는 도구, 테스트·스크립트에 활용
logger -p auth.warning “메시지” / logger -t “MYAPP” -p local0.info “메시지”(태그) / logger -t “MYAPP” –id=$$(PID포함) / logger -p auth.warning -n [IP](원격서버로 전송)
확인: tail -5 /var/log/auth.log / grep “MYAPP” /var/log/syslog
• 핵심포인트: Facility=출처번호, Severity=심각도(0~7) / PRI=Facility×8+Severity(시험자주출제) / 숫자낮을수록 더심각(0=Emergency가장위험) / logger명령=터미널에서 직접로그 만들기(테스트용)
════════════════════
Ch3. rsyslog
════════════════════
• rsyslog(Rocket-fast SYStem for LOGging) = 기존 syslogd를 대체하는 고성능 멀티스레드 로그수집데몬. 필터링·다양한 출력모듈·원격전송 지원
• 흐름: Input Modules(imuxsock,imklog,imtcp) → 파싱/정규화 → Main Queue(메모리/디스크버퍼링,선입선출구조) → Rule Engine(Facility/Severity) → Output Modules(omfile,omfwd)
• 주요모듈
Input: imuxsock(/dev/log UNIX소켓입력,기본) / imklog(커널로그,/dev/kmsg) / imtcp(TCP514 네트워크입력) / imudp(UDP514 네트워크입력)
Output: omfile(파일출력,기본) / omfwd(원격서버포워딩,TCP/UDP) / ommysql(MySQL출력) / omelasticsearch(Elasticsearch출력,ELK연동)
• /etc/rsyslog.conf 핵심설정 - 로그를 수집·처리하는 rsyslog데몬 설정파일
모듈로드: module(load=“imuxsock”) / module(load=“imklog”) / module(load=“imudp”) / input(type=“imudp” port=“514”)
전역설정: $WorkDirectory /var/spool/rsyslog / $ActionFileDefaultTemplate / $FileOwner syslog / $FileGroup adm / $FileCreateMode 0640 / $IncludeConfig /etc/rsyslog.d/*.conf(추가설정파일 포함)
원격전송설정: . @192.168.111.135:514(UDP전송, @=UDP) / . @@192.168.111.135:514(TCP전송, @@=TCP)
• 필터규칙(Selector문법): Facility.Severity → Action(저장할파일등)
kern.*(kern의 모든심각도, *=모든레벨) / *.err(모든퍼실리티의 err이상, .=해당레벨이상누적) / kern.=info(정확히일치, .==딱그레벨만) / kern.!info(info이상 제외, .!=해당레벨이상 제거) / mail,news.crit(OR조건,여러Facility) / .;mail.none(mail제외모든로그, none=해당Facility전체차단)
• /etc/rsyslog.d/50-default.conf 예시
auth,authpriv.* /var/log/auth.log(인증로그)
.;auth,authpriv.none -/var/log/syslog(auth제외한 전체)
kern.* -/var/log/kern.log(커널로그)
mail.* -/var/log/mail.log(메일로그) / mail.err /var/log/mail.err
파일명 앞 ‘-’ = 비동기쓰기(성능향상), 없으면 동기쓰기
• 관리명령어: sudo systemctl status/restart rsyslog / sudo rsyslogd -N1(설정파일 문법검사) / rsyslogd -v(버전확인)
• 관련파일: /etc/rc.d/init.rsyslog(rsyslogd 데몬동작스크립트) / /etc/rsyslog.conf(전역설정파일) / /etc/sysconfig/rsyslog(데몬실행관련 옵션설정파일) / /sbin/rsyslogd(실제 데몬실행명령)
• 핵심포인트: rsyslog=로그받아 분류·저장·전송하는 우편분류기 / Input모듈로받고→Rule Engine으로분류→Output모듈로 저장/전송 / @=UDP전송,@@=TCP전송 / *.err=err이상전부,kern.=info=info만,mail.none=mail제외
════════════════════
Ch4. rsyslog 원격전송
════════════════════
• 로그발생 시스템(Client)이 자신의 로그를 저장하는 동시에 중앙로그서버(Server)로 전송하는 Client-Server구조
• Originator(로그발생Client) → Optional Relay(중계) → Collector(로그수집Server) → 파일/DB저장
• 전송포트: 514번(UDP 또는 TCP) / 전송형식: facility·severity·메시지 / 확인명령: tail -f /var/log/syslog
• 실습환경: VM1(로그서버,IP:192.168.111.135, 클라이언트로그를 TCP로받아 파일저장) / VM2(로그클라이언트,IP:192.168.111.140, 내부로그를 서버로 실시간전송)
• 서버설정(수신측), 파일: /etc/rsyslog.d/remote_web.conf
module(load=“imtcp”) / input(type=“imtcp” port=“514”)(TCP수신모듈 로드, 포트514 개방)
$template WebServerRemote,”/var/log/web_remote/%HOSTNAME%/%PROGRAMNAME%.log”(호스트별,프로그램별 저장경로 템플릿)
if $fromhost-ip != ‘127.0.0.1’ then ?WebServerRemote(로컬제외 원격로그만 저장)
if $fromhost-ip != ‘127.0.0.1’ then stop(원격로그가 /var/log/syslog에 중복저장 안되게)
→ 서버 재시작: sudo systemctl restart rsyslog
• 클라이언트설정(전송측), /etc/rsyslog.conf 하단추가
. @@192.168.111.135:514 (@=UDP, @@=TCP)
→ 클라이언트 재시작: sudo systemctl restart rsyslog
• 테스트명령어: netstat -tunlp | grep 514 / ss -tunlp | grep 514(리스닝확인)
logger -p local0.info -t “custom-app” “메시지” / logger -p auth.warning -t “ssh-monitor” “메시지”
logger -n [IP] -P 514 -T “TCP테스트”(TCP전송) / logger -n [IP] -P 514 -U “UDP테스트”(UDP전송)
ls /var/log/web_remote/(원격로그 저장확인)
• 핵심포인트: @=UDP(빠르지만 유실가능), @@=TCP(안정적,재전송보장,보안환경에 권장) / 서버먼저설정→재시작→클라이언트설정→재시작→테스트 순서 / %HOSTNAME%/%PROGRAMNAME%.log 템플릿=호스트별/프로그램별 폴더자동생성 / fromhost-ip != 127.0.0.1 조건=로컬로그와 원격로그 분리
════════════════════
Ch5. journald (systemd-journal)
════════════════════
• journald = systemd의 로그수집데몬. 로그를 바이너리(이진)파일로 저장하므로 cat,less 대신 journalctl 전용명령어 사용
• syslog vs journald 비교
저장형식: syslog는 텍스트, journald는 바이너리
저장위치: /var/log/syslog 등 vs /run/log/journal/ 또는 /var/log/journal/
조회명령: cat,tail,grep vs journalctl전용
보관방식: logrotate관리 vs 용량제한에 따라 자동순환
네트워크전송: 원격전송 쉬움 vs 기본지원안함(로컬전용)
• journalctl 기본조회: journalctl(전체로그) / -r(최신순역순) / -n 50(최근50개) / -f(실시간모니터링,tail -f와유사) / -e(마지막부분으로 이동) / -b(현재부팅 로그만)
• 시간필터: –since “날짜시간” / –until “날짜시간” / –since “yesterday” / –since와 –until 조합
• 서비스/프로세스필터: -u nginx(Nginx유닛로그) / -u ssh -p err / -u cron.service / sudo journalctl -u nginx -f(실시간) / _PID=1234 / _UID=1000 / _COMM=sshd
• 심각도필터: -p err(err이상,err/crit/alert/emerg) / -p warning..err(범위) / -p 0..3 / -k -b(커널로그만, -k=–dmesg)
• 출력형식: -o short / -o verbose / -o json / -o json-pretty(가독성좋음) / -o cat(메시지만)
• 용량관리: –disk-usage(현재사용량) / –vacuum-size=100M(100MB이하로 정리) / –vacuum-time=2weeks(2주이전삭제) / –verify(journal파일 무결성검증)
• /etc/systemd/journald.conf 설정: SystemMaxLogFiles / RuntimeMaxLogFiles / VacuumLogSpace=100M / LogSize=10M
• 혼합필터링 예시: journalctl _UID=1000 -p err –since “날짜” / journalctl -u sshd –since “1 hour ago” -o json-pretty | head -60 / journalctl > log.txt(파일로 저장) / journalctl | grep “error” / journalctl _COMM=sshd -p warning -n 20
• 핵심포인트: journald=바이너리저장→반드시 journalctl로 조회 / -u서비스명,-p심각도,–since시간 조합해서 검색 / -f=실시간모니터링 / –vacuum-size=100M으로 용량정리가능
════════════════════
Ch6. logrotate
════════════════════
• 로그파일이 무한정 커지는것을 방지하기위해 자동으로 순환(rotate)·압축(compress)·삭제(remove) 수행하는 도구. 기본적으로 cron을 통해 매일실행(/etc/cron.daily/logrotate)
• 순환흐름: app.log(현재로그) → rotate → app.log.1(1번째보관) → rotate → app.log.2.gz(압축보관) → 4회후 삭제
→ 순환될때마다 파일이 한번호씩 밀리고, 설정된 보관수 초과시 자동삭제
• 주요설정옵션: daily/weekly/monthly(순환주기) / rotate 14(14개보관후 삭제) / compress(gzip압축) / delaycompress(최근순환파일은 다음번에 압축) / missingok(파일없어도 에러없이 넘어감) / notifempty(비어있으면 순환건너뜀) / sharedscripts(여러파일 일치해도 postrotate 1번만실행) / create 0644 root root(새빈파일 생성권한) / postrotate/endscript(순환직후 실행할 명령블록)
• 설정파일 예시(/etc/logrotate.d/custom-app)
/var/log/custom-app/service.log { daily, rotate 3, compress, delaycompress, missingok, notifempty, create 0644 root root }
/var/log//.log { daily, rotate 14, compress, delaycompress, missingok, notifempty, sharedscripts, postrotate /usr/lib/rsyslog/rsyslog-rotate endscript }
• 실습순서: 로그파일 생성·기록 → logrotate 설정파일 작성 → sudo logrotate -d 설정파일 → sudo logrotate -f 설정파일 → ls -lh로 결과확인(service.log.1생성) → 다시기록후 재실행하면 service.log.2.gz 생성 확인
• tee 명령어: 파이프로 들어온 데이터를 화면에 출력하면서 동시에 파일에도 저장
echo “hello” | tee log.txt(덮어쓰기) / echo “hello” | tee -a log.txt(추가,append) / echo “hello” | sudo tee log.txt(root권한필요시)
• 핵심포인트: logrotate=로그파일 자동정리도구(매일 cron으로 실행) / rotate 14=14일치보관, compress=gzip압축, notifempty=빈파일건너뜀 / -d옵션=테스트(실제실행안함), -f옵션=강제실행 / postrotate: rsyslog-rotate 실행→rsyslog에게 새파일에 로그쓰라고 알려줌
• 전체요약: 로그란(커널·사용자로깅,dmesg=커널링버퍼,/var/log=사용자로그) / syslog(Facility·Severity·PRI, PRI=Facility×8+Severity) / rsyslog(로그분류·저장데몬, @=UDP,@@=TCP,.=이상,.==딱그것만) / 원격전송(Client-Server구조,서버먼저→클라이언트순서) / journald(바이너리로그수집,journalctl명령,-u/-p/–since조합) / logrotate(자동로그파일관리,-d=테스트,-f=강제,rotate=보관수)
'운영체제' 카테고리의 다른 글
| [전공 기말고사 정리] 운영체제 – RAID 방식 비교·mdadm 구현 실습·장애조치 (0) | 2026.07.30 |
|---|---|
| [전공 기말고사 정리] 리눅스 운영체제 – 파일 디스크립터·리다이렉션·프로세스 관리·systemd·cron/at (0) | 2026.07.30 |
| [전공 기말고사 정리] 리눅스 운영체제 – 디스크 인터페이스·파일시스템·마운트·디스크 (0) | 2026.07.29 |
| [전공 실습 정리] 네트워크 설정 – nmcli·Netplan·패킷 캡처·VM 라우터 (0) | 2026.07.28 |
| [전공 실습 정리] 운영체제 실습 - 패키지 관리·미러 설정·압축과 묶기 (0) | 2026.07.28 |