분석 · 관제핵심 · 18분 읽기

Syslog·rsyslog: 발생부터 중앙 수집까지

로그 메시지의 필드, 수신 규칙, 전송 큐와 보관 경계를 연결하고, 송신 성공·파일 저장·SIEM 반영을 각각 검증하는 방법을 다룹니다.

개념부터 찾아보기

정의·역할·동작 원리를 독립 페이지에서 확인하세요. 본문의 밑줄 용어에도 설명이 있습니다.

이 노트에서 설명할 수 있게 되는 것

  1. PRI와 메시지 필드를 해석한다.
  2. 큐·전송·수신·저장 경계별 보장 범위를 구분한다.
  3. 시험 표식을 통해 중앙 수집 경로를 검증한다.

01개념과 구성 요소

  • 발생기는 사건을 기록하고 중계기는 전달하며 수집기는 여러 발신자의 메시지를 저장한다.
  • ·시각·호스트·프로그램·본문 등은 형식과 파서에 따라 분리되는 필드다.
  • 전송 방식·큐·저장 완료·원본 보존은 서로 다른 보장 범위다.

02rsyslog가 원격 메시지를 저장하는 순서

  1. 애플리케이션 또는 장비가 ·와 본문을 포함한 메시지를 만든다.
  2. 같은 모듈이 지정된 포트에서 메시지를 받아 연결된 으로 넘긴다.
  3. 이 조건과 action을 평가하고 이 저장 경로나 출력 표현을 결정한다.
  4. 원격 전송 action은 큐에서 대기·재시도할 수 있다. 큐 한도와 영속성에 따라 장애 시 지연·손실이 달라진다.
  5. 수집 파일과 파싱·검색 결과에서 같은 시험 식별자를 확인한다. 연결 성공이나 송신 성공만으로 최종 적재를 대신하지 않는다.

03로그 발생기·중계기·수집기의 역할

  • 애플리케이션이 사건을 문자열로 남기는 것과 그 기록이 관제 화면에 나타나는 것은 여러 단계를 거친다. 로컬 소켓이나 파일, journald에서 입력 모듈이 메시지를 받고, 규칙이 필드를 해석하고 조건을 평가한 뒤 파일 저장 또는 원격 전송 같은 action을 실행한다.
  • 중앙 수집기도 다시 입력·규칙·출력 단계를 가진다.
  • 원본 실습의 목적은 여러 서버의 기록을 중앙 서버에 모으는 것이다. 이때 응용 프로그램의 사건 시각, 송신 호스트의 시계, 중계기가 받은 시각, 에 적재한 시각을 섞으면 사건 순서가 뒤집혀 보일 수 있다.
  • 표준 시각 동기화와 시간대 표기, 원문 보존이 검색보다 먼저 필요하다.
  • 중앙에 모았다는 이유만으로 기록을 신뢰할 수 있는 것은 아니다. 송신자가 로그를 조작하거나 중계에서 누락할 수 있고, 파서가 일부 메시지를 버릴 수도 있다.
  • 발생→전송→수신→저장→검색의 각 경계에서 무엇을 확인했는지 남겨야 한다.

04메시지 구조와 PRI를 실제 숫자로 읽기

  • 형식은 , VERSION, TIMESTAMP, HOSTNAME, APP-NAME, PROCID, MSGID, 와 선택적인 MSG를 구분한다. 모든 필드가 자유로운 본문 문자열은 아니다.
  • 값을 모르는 헤더 필드에는 NILVALUE인 -가 사용될 수 있으며 는 구조화된 이름·값을 담는다.
  • 는 × 8 + 이다. 아래의 134는 16(local0)과 6(informational)의 결합이다.
  • 는 0이 가장 긴급하고 7이 debug이므로 숫자가 클수록 심각하다고 정렬하면 반대로 해석하게 된다. 는 발생 범주이며 앱 이름이나 정확한 소스 파일 경로가 아니다.
  • 모든 송신 장비가 같은 형식을 사용하는 것은 아니다. 전통적인 RFC 3164 계열 메시지, 장비 고유 포맷, journald 필드와 변환 결과가 섞일 수 있다.
  • 연도·시간대가 빠진 기록은 수신 시점과 장비 시계가 해석에 영향을 준다.
text
<134>1 2026-02-03T09:00:00+09:00 app01 demo 1234 CHECK - local test marker
134 = 16 × 8 + 6

형식과 계산을 설명하기 위해 새로 만든 예시이며 실제 수업 로그가 아니다.

05UDP·TCP·TLS·RELP가 보장하는 범위

  • 수신은 메시지 단위가 단순하고 송신 부담이 작지만 손실·중복·순서 변경을 복구하지 않는다. 는 연결 안에서 순서 있는 바이트 전달과 재전송을 제공한다.
  • 하지만 상대 가 데이터를 받았다는 사실은 상대 디스크에 영속 저장되거나 인덱스에 반영되었다는 확인이 아니다.
  • 의 바이트 스트림에는 별도 메시지 경계 규칙이 필요하다. 줄바꿈 기반 framing은 메시지 내부 줄바꿈과 충돌할 수 있으며 octet-counting은 바이트 길이로 경계를 지정한다.
  • 양쪽 입력·출력 설정이 일치해야 긴 로그와 여러 줄 로그가 섞이지 않는다.
  • 는 전송 구간의 기밀성·무결성과 설정에 따른 상대 인증을 제공한다. port="6514", protocol=""만 설정하는 것으로 가 활성화되지는 않는다.
  • 인증서·CA·peer 이름 검증과 stream driver를 양끝에 구성해야 한다. 는 응용 계층 확인 응답을 추가하지만 송신 큐와 수신 저장 경계, 후속 처리까지 설계해야 전체 전달 수준을 설명할 수 있다.
전송 예핵심 성질별도로 확인할 것
514개별 datagram, 응답 확인 없음손실·발신지 위조·수신 큐 초과
514연결 내 순서·재전송framing·재연결·디스크 저장 여부
6514로 보호된 전송 관례실제 설정·인증서 신뢰·peer 검증
, 필요 시 메시지 처리 확인 응답큐 영속성·후속 저장·중복 처리
원리 심화

06Syslog TCP 메시지 경계와 UTF-8 길이

  • 는 순서 있는 바이트를 전달하지만 send 한 번과 recv 한 번의 경계를 보존하지 않는다. 수집기는 별도 프레이밍 규칙을 알아야 한다.
  • RFC 6587의 길이 방식은 십진수 바이트 길이·공백·해당 길이의 -MSG로 프레임을 만든다. 글자 수가 아니라 옥텟 수를 센다.
  • 줄바꿈 구분 방식은 메시지 자체에 같은 문자가 들어올 때 모호함이 생길 수 있다. 송수신기가 선택한 방식을 일치시킨다.
  • 의 는 공백으로 단순 분할하면 안 된다. 매개변수 값의 따옴표·역슬래시·닫는 대괄호는 정해진 이스케이프 규칙을 따른다.
  • 광고된 프레임 길이를 그대로 메모리 할당에 쓰지 않는다. 허용 길이·대기시간·불완전 프레임 처리 정책을 둔다.
예제로 추적

07가상 Syslog 메시지가 두 번에 나뉘어 도착할 때

  1. ASCII 메시지 <134>1 - h a - - - ok를 사용한다. 문자들이 모두 1바이트이므로 전체 -MSG 길이는 21바이트다.
  2. 길이 방식의 전송 표현은 21 뒤 공백과 21바이트 메시지다. 길이 숫자와 공백은 -MSG 길이에 포함하지 않는다.
  3. 첫 recv에 21 과 메시지 앞부분만 오면 수집기는 완료로 처리하지 않고 남은 바이트 수를 유지한다.
  4. 메시지 21바이트가 모두 모이면 한 레코드를 전달한다. 같은 recv에 다음 프레임이 붙어 있으면 남은 버퍼에서 다음 길이를 읽는다.
  5. MSG의 ok를 한글 가로 바꾸면 2바이트 대신 3바이트가 들어간다. 같은 글자 수 변화로 계산하지 않고 전체 바이트 길이를 다시 구한다.
검증·예외

08연결은 유지되지만 메시지가 합쳐지거나 멈출 때

  • 송신기의 과 수신기의 줄바꿈 방식을 먼저 비교한다. 성공은 애플리케이션 메시지 경계 일치까지 보장하지 않는다.
  • 인코딩 전 문자 수로 길이를 작성했는지 본다. ASCII 로그는 통과하고 한글 로그만 깨지는 패턴은 중요한 단서다.
  • 입력 수신· 전달··파일 저장을 나누어 본다. 연결 상태만으로 최종 파일 적재를 판정하지 않는다.
  • 연결 종료 때 미완성 프레임을 어떤 오류로 남기는지 확인한다. 불완전한 바이트를 정상 한 줄로 저장하면 이후 파싱이 잘못될 수 있다.

09수신 모듈을 별도 ruleset에 연결하기

  • imudp와 는 네트워크 입력 모듈이다. remote_ingest 은 원격 로그를 로컬 운영 로그와 구분해 저장하며 stop으로 이 의 뒤쪽 규칙 처리를 끝낸다.
  • stop을 잘못 앞에 배치하면 필요한 다른 출력도 실행되지 않는다.
  • %HOSTNAME%은 메시지에서 주장하는 값이므로 원문 그대로 파일 경로에 넣으면 경로 오염이나 호스트 오분류의 원인이 된다. %fromhost-ip%는 관측한 네트워크 송신 주소이지만 에서는 위조 가능하고 ·중계기를 거치면 원래 서버 주소가 아니다.
  • 인증된 신원이나 관리 자산 목록과 연결해 해석한다.
  • 아래 예는 내부 실습망의 수신 구조를 설명한다. 방화벽 허용 범위, 접근 정책, 디렉터리 권한, 정책은 별도이며 외부 공개 수집 서버의 완성 설정이 아니다.
  • 날짜가 들어간 파일명은 메시지 저장 시점의 시스템 시간 기준이므로 늦게 도착한 사건의 사건 날짜와 다를 수 있다.
module(load="imtcp")
template(name="RemotePath" type="string"
 string="/var/log/remote/%fromhost-ip%/%$YEAR%-%$MONTH%-%$DAY%.log")
ruleset(name="remote_ingest") {
 action(type="omfile" dynaFile="RemotePath"
        dirCreateMode="0750" fileCreateMode="0640")
 stop
}
input(type="imtcp" port="514" ruleset="remote_ingest")

원문의 수집 구조를 재구성한 설정 조각. 기존 모듈 로딩과 중복하지 않도록 합쳐야 한다.

10송신 큐가 장애를 완충하는 과정

  • 전송 대상이 멈추면 가 메시지를 보관하고 재시도할 수 있다. LinkedList는 메모리 큐 유형이며 queue.filename을 지정한 디스크 보조 구성은 일정 조건에서 디스크로 넘긴다.
  • 디스크 보조 큐를 설정했다는 사실만으로 모든 최근 메시지가 즉시 디스크에 동기 기록되는 것은 아니다.
  • queue.saveOnShutdown은 정상 종료 때 남은 큐를 저장하는 데 도움이 되지만 갑작스러운 전원 장애와 강제 종료에서 메모리의 미기록 메시지를 모두 구하는 약속은 아니다. action.resumeRetryCount=-1은 재시도를 계속한다는 뜻이지 메모리·디스크가 무한하다는 뜻이 아니다.
  • 발생량이 초당 1,000건이고 장애가 한 시간이라면 360만 건이 쌓인다. 평균 500바이트만 가정해도 본문만 약 1.8GB이며 큐 구조·파일 부가 비용이 더 필요하다.
  • 큐 한도, 디스크 여유, 버림 정책과 복구 뒤 배출 속도를 함께 계산한다. 송신량보다 배출량이 작으면 연결이 복구되어도 적체는 줄지 않는다.
action(type="omfwd" target="192.0.2.10" port="514" protocol="tcp"
 queue.type="LinkedList" queue.filename="remote_forward"
 queue.maxDiskSpace="10g" queue.saveOnShutdown="on"
 action.resumeRetryCount="-1")

문서용 주소를 쓴 평문 큐 예제. 기존 workDirectory의 쓰기 권한과 충분한 공간을 전제로 하며 예제가 아니다.

11원본 보관·회전·접근 권한의 경계

  • 수집 파일에는 계정명, 내부 주소, 요청 경로 등 민감한 운영 정보가 들어갈 수 있다. 읽기 권한과 보관 기간은 분석 목적에 맞추고 원본 파일과 파싱한 이벤트의 연결을 유지한다.
  • 파서 수정 뒤 다시 처리할 수 있도록 원문과 수신 시각을 보존하는 설계가 유용하다.
  • 날짜별 파일을 만들면 파일명 자체가 일 단위 분할을 수행한다. 같은 활성 파일을 다시 매일 이름 변경하는 회전을 무조건 겹치지 않는다.
  • 닫힌 날짜 파일의 압축·보관 만료와 현재 열린 파일의 핸들을 별개로 다룬다. 디스크가 가득 차면 큐까지 같은 디스크에 있을 때 수신과 재시도 보관이 함께 실패할 수 있다.
  • 로 전달한 뒤 평문 파일로 저장하는 것은 전송 보호와 저장 보호가 다른 문제임을 보여 준다. 파일 무결성, 백업과 권한 감사는 전송 설정으로 대체되지 않는다.

12검증: 설정 문법에서 최종 검색까지

  • rsyslogd -N1은 설정 문법과 일부 구성 오류를 검사한다. 수신 소켓 개방, 네트워크 통과, 실제 파일 쓰기, 검색 반영 성공을 대신하지 않는다.
  • service 상태와 저널 오류를 확인한 뒤 송신 노드에서 구별 가능한 시험 표식을 한 번 보내 수신 파일과 에서 같은 표식을 추적한다.
  • 테스트 때 송신 건수, 수신 원문 건수, 파싱 성공·실패 건수, 최종 적재 건수를 나눠 기록한다. 반복 재전송은 중복을 만들 수 있으므로 건수가 같다고 내용까지 같다고 단정하지 않는다.
  • 장비 재시작, 수집 서버 정지, 디스크 여유 감소를 시험할 때에도 격리된 실습 환경에서 각 큐와 손실 경계를 관찰한다.
shell
rsyslogd -N1
systemctl status rsyslog
journalctl -u rsyslog --since "10 minutes ago"
ss -lntup
# 송신 측의 로컬 rsyslog 전송 규칙이 설정된 실습에서만
logger -p local0.info -t course-check "course-log-check-001"

점검 명령의 의미를 설명하는 예제다. logger는 로컬 로그를 실제 생성하며 전송 규칙이 없으면 원격으로 보내지지 않는다.

LEARN THROUGH PRACTICE

TCP 수신 설정과 수집된 웹 로그를 한 경로로 읽기

수신 포트, 머리말, 웹 서버의 원래 메시지를 구분하여 전달 실패와 애플리케이션 오류를 가려낸다.

실습 구성과 전제

  • 격리 실습망의 송신기와 수신기에서 시간대·호스트 이름·전송 포트를 기록한다.
  • 이 실습의 514/ 예시는 평문 수신이다. 를 적용하려면 인증서와 스트림 드라이버 등 별도 설정이 필요하다.
  1. 수신 모듈과 소켓이 같은 조건인지 확인하기

    • 모듈은 연결에서 메시지를 받는 입력 모듈이다. 모듈을 불러오는 행과 실제 514번 포트를 여는 input 행이 모두 있어야 의도한 수신 구성이 된다.
    • 설정 파일이 존재하는 것, 문법 검사가 통과하는 것, 현재 가 포트를 열고 있는 것은 별개다. 문법 검사 뒤 실제 LISTEN 소켓과 방화벽 경로를 확인한다.
    bash
    rsyslogd -N1
    ss -lntp

    현재 설정의 문법과 수신 소켓을 조회한다. 설정 검사만으로 서비스가 재시작되지는 않는다.

    rsyslog · 실습·개념 참고 화면 1원본 크기로 보기 ↗
    • module(load="imtcp")와 input(type="imtcp" port="514")가 함께 보인다. 입력 모듈과 수신 포트가 각각 지정되어 있다.
    • 이 부분에는 TLS 인증서나 암호화 모드 지정이 보이지 않는다. TCP라는 이유만으로 암호화 전송이라고 할 수 없다.
    확인 기준

    설정 검사 결과와 514/ LISTEN이 일치해야 수신 준비가 됐다고 판단한다.

  2. 고유 표식 한 건을 보내 저장 경로를 찾기

    • 다른 이벤트와 구별되는 lab-event-001 같은 표식을 보내고, 송신 시각·수신 시각·저장 파일에서 같은 문자열을 찾는다. 재전송 시험에서는 같은 이벤트의 중복 저장 여부도 센다.
    • 수신 파일의 머리말 뒤에는 원래 애플리케이션 메시지가 그대로 들어갈 수 있다. 외부 호스트명과 내부 시간 문자열은 서로 다른 필드이므로 하나의 으로 무리하게 합치지 않는다.
    bash
    logger --tcp --server 127.0.0.1 --port 514 --tag lab-source 'lab-event-001'

    수신기 자체의 로컬 입력 확인 예. 원격 경로 시험은 자신이 관리하는 수신기 주소로 바꿔 별도로 진행한다.

    rsyslog · 명령·상태 출력 2원본 크기로 보기 ↗
    • 각 행의 앞에는 Jun 9 시각, localhost, httpd-access가 있고 그 뒤에 대괄호로 감싼 Apache 요청 시각이 다시 나타난다.
    • 같은 수집 파일에서 GET 요청의 상태 코드 500과 정적 파일 요청의 304가 함께 보인다. 수집 파일에 기록됐다는 사실과 웹 요청 성공 여부는 별도다.
    확인 기준

    표식이 없으면 송신→포트→→action→파일 권한 순으로 좁힌다. 웹 500을 전송 실패로 분류하지 않는다.

  3. Severity와 웹 상태 코드의 의미를 분리하기

    • 는 0이 가장 긴급하고 7이 디버그인 메시지 분류다. HTTP 500의 숫자와 같은 척도가 아니며, 전달된 메시지 내용만 보고 를 임의로 바꾸면 안 된다.
    • 필터가 범위를 제한하면 전달은 됐어도 선택한 저장 action에는 남지 않을 수 있다. 수신 원본과 최종 파일에서 표식을 비교하여 필터에 의한 누락인지 판단한다.
    network log · 실습·개념 참고 화면 3원본 크기로 보기 ↗
    • 표에는 emerg 0부터 debug 7까지 여덟 단계가 나온다. 숫자가 커질수록 더 긴급해지는 구조가 아니다.
    • notice는 5, info는 6으로 별도 행이다. 정상 동작 중에도 주목할 사건과 일반 정보 메시지를 나누어 분류할 수 있다.
    확인 기준

    내용의 HTTP 상태 코드, , 최종 저장 action을 각각 기록하면 누락과 애플리케이션 장애를 혼동하지 않는다.

실습에서 확인한 동작 원리

  • 연결 성립과 로그 파일 저장 사이에는 입력·필터·action·파일 권한 단계가 있다.
  • 머리말과 원래 메시지를 함께 보존하면 전송 경로와 애플리케이션 사건을 나중에 다시 해석할 수 있다.

설정·출력 추가로 확인하기 10장

아래 화면을 펼쳐 위 실습의 설정값, 명령과 확인 기준을 비교해 보세요. 각 묶음은 별도 실습 기록입니다.

실습 화면 묶음 01 1장
log (6/4) · 실습·개념 참고 화면 1원본 크기로 보기 ↗
  • 「②서버별/종류별 로그 저장 규칙 추가 (룰셋 설정)」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Syslog·rsyslog 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 02 8장
network log · 구성·동작 참고 화면 1원본 크기로 보기 ↗
  • 문서 문맥에 삽입된 원본 구성·동작 참고 화면이다. Syslog·rsyslog 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
network log · 명령·상태 출력 7원본 크기로 보기 ↗
  • 「client 에서 (== 주피터 서버)」 문맥에 삽입된 원본 명령·상태 출력이다. Syslog·rsyslog 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
network log · 명령·상태 출력 8원본 크기로 보기 ↗
  • 「client 에서 (== 주피터 서버)」 문맥에 삽입된 원본 명령·상태 출력이다. Syslog·rsyslog 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
network log · 실습·개념 참고 화면 2원본 크기로 보기 ↗
  • 「<라우터 - step>」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Syslog·rsyslog 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
network log · 실습·개념 참고 화면 4원본 크기로 보기 ↗
  • 「client 에서 (== 주피터 서버)」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Syslog·rsyslog 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
network log · 실습·개념 참고 화면 5원본 크기로 보기 ↗
  • 「client 에서 (== 주피터 서버)」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Syslog·rsyslog 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
network log · 실습·개념 참고 화면 6원본 크기로 보기 ↗
  • 「client 에서 (== 주피터 서버)」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Syslog·rsyslog 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
network log · 실습·개념 참고 화면 9원본 크기로 보기 ↗
  • 「client 에서 (== 주피터 서버)」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Syslog·rsyslog 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 03 1장
rsyslog · 실습·개념 참고 화면 4원본 크기로 보기 ↗
  • 「mariadb」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Syslog·rsyslog 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
동작·명령 참고 문서
READ · OBSERVE · CONNECT

함께 보는 학습 자료

아래 공식 자료를 본문의 개념·예제와 함께 읽어 보세요. 자료별로 확인할 위치와 관찰할 내용을 적었습니다.

표준

RFC 6587: TCP Syslog 메시지 경계

MSG-LEN SP -MSG 구조를 읽어 한 번의 수신과 한 건이 같지 않은 이유를 설명한다.

읽으면서 확인할 것
  • MSG-LEN은 문자 수가 아닌 octet 수
  • 길이 숫자와 구분 공백을 세는 범위
  • 줄바꿈 구분 방식이 본문 개행과 충돌하는 경우
학습 확인

이해했는지 확인하기

  • Facility·Severity·호스트·시간이 예상대로 저장되는지 확인한다.
  • TLS 인증과 큐·재시도·디스크 한도 정책을 확인한다.
  • 고유 시험 이벤트가 최종 검색 결과까지 도달하는지 확인한다.

함께 확인할 공식 자료