1. rsyslog란?
rsyslog
는 "rocket-fast system for log processing"의 약자로,
기존 syslog
의 성능을 대폭 강화한 고성능 로그 관리 시스템입니다. 빠른 속도와 강력한 기능을 제공하며, 대부분의 리눅스 배포판에 기본적으로 포함되어 있습니다.
rsyslog의 주요 특징
- 멀티스레드 지원: 기존
syslog
대비 빠른 로그 처리가 가능합니다. - 다양한 입력/출력 옵션: 파일, 데이터베이스, 원격 서버, Elasticsearch 등 다양한 대상으로 로그를 보내거나 받을 수 있습니다.
- 강력한 필터링 기능: Facility/Severity 기반 필터링뿐만 아니라 정규식을 활용한 고급 필터링도 가능합니다.
- 원격 로그 전송: UDP, TCP, TLS 프로토콜을 통해 안전하게 원격으로 로그를 전송할 수 있습니다.
- 플러그인 기반 확장성: MySQL, Kafka, Elasticsearch 등 다양한 외부 시스템과의 연동을 위한 플러그인을 지원합니다.
rsyslog 상태 확인
- rsyslog 서비스 상태 확인:
systemctl status rsyslog
- rsyslog 버전 확인:
rsyslogd -v
주요 설정 파일 및 디렉토리
파일/디렉토리 | 설명 |
---|---|
/etc/rsyslog.conf |
rsyslog 메인 설정 파일 |
/etc/rsyslog.d/*.conf |
추가 설정을 위한 파일들이 위치하는 디렉토리 |
/var/log/ |
기본 로그 저장 디렉토리 |
/var/log/syslog |
시스템 로그 (Ubuntu, Debian 계열) |
/var/log/messages |
시스템 로그 (CentOS, RHEL 계열) |
2. 다양한 입력 및 출력 모듈 활용
rsyslog
는 다양한 모듈을 통해 로그 데이터를 수집하고 전송할 수 있습니다.
2.1. 입력 (Input Modules) 설정 및 확인
1. systemd journal 로그 수집 (imjournal
모듈)
- 설정 파일:
/etc/rsyslog.conf
또는/etc/rsyslog.d/imjournal.conf
module(load="imjournal") # systemd journal 로그 사용 설정
- 확인: 실시간 journal 로그 확인
journalctl -f
2. UDP 포트에서 syslog 수신 (imudp
모듈)
- 설정 파일:
/etc/rsyslog.conf
또는/etc/rsyslog.d/udp.conf
module(load="imudp") input(type="imudp" port="514")
- 확인: UDP 514번 포트 리스닝 상태 확인
netstat -tunlp | grep 514
3. TCP 포트에서 syslog 수신 (imtcp
모듈)
- 설정 파일:
/etc/rsyslog.d/tcp.conf
module(load="imtcp") input(type="imtcp" port="514")
- 확인: TCP 514번 포트 리스닝 상태 확인
netstat -tunlp | grep 514
4. 특정 파일 모니터링 (imfile
모듈)
- 설정 파일:
/etc/rsyslog.d/imfile.conf
module(load="imfile") input(type="imfile" File="/var/log/custom.log" # 모니터링할 파일 경로 Tag="custom" # 로그에 사용할 태그 StateFile="customstate" # 파일 읽기 상태 저장 파일 (rsyslog 작업 디렉토리 기준) )
- 확인: 해당 파일의 로그 변경 사항 실시간 확인
tail -f /var/log/custom.log
2.2. 출력 (Output Modules) 설정 및 확인
1. 로그를 파일에 저장 (omfile
모듈 - 기본)
- 설정 파일:
/etc/rsyslog.d/output.conf
(또는/etc/rsyslog.conf
)# 모든 facility, 모든 priority의 로그를 지정된 파일에 저장 *.* /var/log/custom_output.log
- 확인: 저장된 로그 실시간 확인
tail -f /var/log/custom_output.log
2. 로그를 MySQL DB에 저장 (ommysql
모듈)
- 설정 파일:
/etc/rsyslog.d/mysql.conf
module(load="ommysql") # 모든 로그를 지정된 MySQL 서버, 데이터베이스, 사용자, 비밀번호로 전송 *.* :ommysql:127.0.0.1,rsyslog,rsyslog_user,rsyslog_pass # 형식: *.* :ommysql:DB서버주소,DB이름,DB사용자,DB비밀번호
- 확인: MySQL에 저장된 로그 조회
(사전에
mysql -u rsyslog_user -p -e "SELECT * FROM SystemEvents;" rsyslog
SystemEvents
테이블 및rsyslog_user
생성이 필요합니다. 아래 DB 연동 섹션 참고)
3. 로그를 PostgreSQL DB에 저장 (ompgsql
모듈)
- 설정 파일:
/etc/rsyslog.d/postgresql.conf
module(load="ompgsql") # 모든 로그를 지정된 PostgreSQL 서버, 데이터베이스, 사용자, 비밀번호로 전송 *.* :ompgsql:127.0.0.1,rsyslog,rsyslog_user,rsyslog_pass # 형식: *.* :ompgsql:DB서버주소,DB이름,DB사용자,DB비밀번호
- 확인: PostgreSQL에 저장된 로그 조회
(사전에
psql -U rsyslog_user -d rsyslog -c "SELECT * FROM system_events;"
system_events
테이블 및rsyslog_user
생성이 필요합니다.)
4. 로그를 Kafka로 전송 (omkafka
모듈)
- 설정 파일:
/etc/rsyslog.d/kafka.conf
module(load="omkafka") # 모든 로그를 지정된 Kafka 브로커와 토픽으로 전송 *.* action(type="omkafka" broker="localhost:9092" # Kafka 브로커 주소 topic="rsyslog" # Kafka 토픽 이름 )
- 확인: Kafka 컨슈머를 통해 로그 수신 확인
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic rsyslog
5. 로그를 Elasticsearch로 전송 (omelasticsearch
모듈)
- 설정 파일:
/etc/rsyslog.d/elasticsearch.conf
module(load="omelasticsearch") # 모든 로그를 지정된 Elasticsearch 서버와 인덱스로 전송 *.* action(type="omelasticsearch" server="http://localhost:9200" # Elasticsearch 서버 주소 searchIndex="rsyslog" # Elasticsearch 인덱스 이름 )
- 확인: Elasticsearch API를 통해 로그 조회
curl -X GET "http://localhost:9200/rsyslog/_search?pretty"
3. rsyslog 설정 예시
3.1. 기본 설정 구조
- 설정 파일:
/etc/rsyslog.conf
# 기본 로그 저장 규칙 (모든 facility, 모든 priority) *.* /var/log/syslog # Debian/Ubuntu 계열 # *.* /var/log/messages # RHEL/CentOS 계열 # 특정 로그 필터링 후 별도 파일에 저장 authpriv.* /var/log/auth.log kern.* /var/log/kern.log
- 설정 적용:
systemctl restart rsyslog
3.2. 필터링 설정
Facility/Severity 기반 필터링
- 설정 파일:
/etc/rsyslog.d/filter.conf
# 인증 관련(authpriv) 로그를 별도 파일에 저장 authpriv.* /var/log/auth.log # 커널(kern) 로그를 별도 파일에 저장 kern.* /var/log/kern.log
특정 키워드가 포함된 로그 저장
- 설정 파일:
/etc/rsyslog.d/error_filter.conf
# 메시지 내용에 "error"라는 단어가 포함된 로그를 /var/log/error.log에 저장 :msg, contains, "error" /var/log/error.log
특정 프로그램 로그 저장
- 설정 파일:
/etc/rsyslog.d/ssh_filter.conf
# 프로그램 이름(programname)이 "sshd"인 로그를 /var/log/ssh.log에 저장 :programname, isequal, "sshd" /var/log/ssh.log
특정 IP 주소의 로그 무시
- 설정 파일:
/etc/rsyslog.d/ip_filter.conf
# 출발지 IP($fromhost-ip)가 '192.168.1.100'인 경우 로그 처리 중단 (무시) if $fromhost-ip == '192.168.1.100' then stop
기타 필터링 예시
-
설정 파일:
/etc/rsyslog.conf
또는/etc/rsyslog.d/custom_filters.conf
# 모든 mail 관련 로그 저장 (-/var/log/maillog는 비동기 쓰기) mail.* -/var/log/maillog # cron 관련 로그 저장 cron.* /var/log/cron # 긴급(emerg) 메시지는 모든 현재 로그인한 사용자에게 알림 *.emerg :omusrmsg:* # uucp와 news facility의 crit 이상의 심각도를 가진 로그 저장 uucp,news.crit /var/log/spooler # 부팅 메시지(local7 facility) 저장 local7.* /var/log/boot.log # alert 이상의 심각도를 가진 로그를 콘솔로 출력 *.alert /dev/console
-
설정 적용 (위 필터링 설정 변경 후):
systemctl restart rsyslog
3.3. 원격 로그 전송 설정
클라이언트 설정 (로그를 보내는 측)
- 설정 파일:
/etc/rsyslog.conf
또는/etc/rsyslog.d/remote_send.conf
# UDP로 192.168.0.10 서버의 514번 포트로 모든 로그 전송 *.* @192.168.0.10:514 # TCP로 192.168.0.10 서버의 514번 포트로 모든 로그 전송 (신뢰성 높음) *.* @@192.168.0.10:514
- 설정 적용:
systemctl restart rsyslog
서버 설정 (로그를 받는 측)
- 설정 파일:
/etc/rsyslog.conf
(또는/etc/rsyslog.d/remote_receive.conf
)# UDP 로그 수신 활성화 module(load="imudp") input(type="imudp" port="514") # TCP 로그 수신 활성화 module(load="imtcp") input(type="imtcp" port="514")
- 설정 적용:
systemctl restart rsyslog
원격 로그 저장 형식 정의 (서버 측)
- 설정 파일:
/etc/rsyslog.d/remote.conf
# 원격 로그를 호스트 이름과 프로그램 이름별로 분류하여 저장하는 템플릿 정의 $template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log" # 모든 수신 로그에 대해 RemoteLogs 템플릿 적용 *.* ?RemoteLogs
- 설정 적용:
systemctl restart rsyslog
3.4. 데이터베이스 연동 (예: MySQL)
1. rsyslog MySQL 모듈 설정 (로그를 보내는 측 또는 로컬 저장)
- 설정 파일:
/etc/rsyslog.d/mysql.conf
module(load="ommysql") *.* :ommysql:127.0.0.1,rsyslog,rsyslog_user,rsyslog_pass # 형식: *.* :ommysql:DB서버주소,DB이름,DB사용자,DB비밀번호
- 설정 적용:
systemctl restart rsyslog
2. MySQL 데이터베이스 및 테이블 생성
rsyslog
는 기본적으로 SystemEvents
라는 테이블을 사용하여 로그를 저장합니다.
-- MySQL 접속 후 실행
CREATE DATABASE rsyslog;
USE rsyslog;
CREATE TABLE SystemEvents (
ID INT AUTO_INCREMENT PRIMARY KEY,
ReceivedAt DATETIME NOT NULL DEFAULT NOW(),
DeviceReportedTime DATETIME NOT NULL,
Facility INT NOT NULL,
Priority INT NOT NULL,
FromHost VARCHAR(255) NOT NULL,
Message TEXT NOT NULL
);
-- rsyslog 전용 사용자 생성 및 권한 부여
CREATE USER 'rsyslog_user'@'localhost' IDENTIFIED BY 'rsyslog_pass';
GRANT ALL PRIVILEGES ON rsyslog.* TO 'rsyslog_user'@'localhost';
FLUSH PRIVILEGES;
3. MySQL 데이터 확인
mysql -u rsyslog_user -p -e "SELECT * FROM rsyslog.SystemEvents ORDER BY ID DESC LIMIT 10;"