Profile picture

rsyslog 로그 서버 구축하기

JaehyoJJAng2023년 06월 07일

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;"

Loading script...