LINUX

[CentOS 9] Logstash 설치

블체. 2025. 6. 12. 00:14

 

[Logstash 의 필요성]

syslog-ng 를 설치해서 다른 서버의 로그를 중앙집중식 로그 관리를 한다.

Elasticsearch 를 설치해서 중앙집중된 대량의 로그를 빠르고 효율적으로 조회한다.

문제는 수집되는 로그가 터무니없이 길고, 가독성이 너무 떨어진다는 것.

 

로그 = 단순 문자열

 

Elasticsearch로 수 십만 건의 긴 문자열을 조회하고 색인을 생성 작업은 굉장한 성능저하가 발생한다.

따라서 적절하게 parsing 해줘야한다. 

내 경우에는 보통 json 으로 필드화해서 사용한다.

 

[ Logstash 의 장점]

ES의 조회 성능과 효율성 모두 "크게" 개선

Kibana에서도 필터, 집계, 대시보드 구성이 수월

 

[설치 방법]
1. Elastic 저장소 추가 (이미 있다면 스킵)

sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch



2. 저장소 파일 생성

sudo tee /etc/yum.repos.d/elastic.repo << EOF

 

아래 내용을 작성. 한 번에 붙여넣어도 무관.

주의할 점은 첫 줄의 [elastic-7.x] 를 그대로 작성해야한다는 것.

본인이 사용하는 ES의 버전을 입력하라는 뜻이 아니다.

[elastic-7.1]   >   X 

[elastic-7.x]   >   O

[elastic-7.x]
name=Elastic repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF



3. Logstash 설치

sudo dnf install logstash-7.1.0 -y



4. .conf 작성
conf.d 디렉토리 내부에 .conf 파일 생성. 이름은 임의지정해도 무관. 일반적으로 syslog.conf

아래 내용을 작성. 한 번에 붙여넣어도 무관.

input {
  file {
    path => "/var/HOSTS/*/messages"
    start_position => "beginning"
    sincedb_path => "/var/lib/logstash/sincedb_syslog"
    codec => "plain"
    type => "syslog"
    tags => ["syslog", "host-based"]
  }
}

filter {
  # 호스트명 추출 (경로에서)
  if [path] {
    grok {
      match => { "path" => "/var/HOSTS/(?<source_host>[^/]+)/messages" }
    }
  }

  # syslog 메시지 파싱
  grok {
    match => { 
      "message" => "%{SYSLOGTIMESTAMP:timestamp} %{IPORHOST:hostname} %{PROG:program}(?:\[%{POSINT:pid}\])?: %{GREEDYDATA:log_message}" 
    }
  }

  # 타임스탬프 처리
  if [timestamp] {
    date {
      match => [ "timestamp", "MMM dd HH:mm:ss", "MMM  d HH:mm:ss" ]
      target => "@timestamp"
    }
  }

  # 인덱스 날짜 필드 생성 (YYYY.MM.dd 형식)
  ruby {
    code => "
      event.set('index_date', Time.now.strftime('%Y.%m.%d'))
    "
  }

  # 불필요한 필드 제거
  mutate {
    remove_field => ["path", "host"]
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "syslog-%{source_host}-%{index_date}"
    template_name => "syslog-template"
    template => "/etc/logstash/templates/syslog-template.json"
    template_overwrite => true
  }

  # 디버깅용 (필요시 주석 해제)
  # stdout { 
  #   codec => rubydebug 
  # }
}




5. Elasticsearch 템플릿 파일 생성
/etc/logstash/templates 디렉토리 생성. 하위에 .json 파일 생성. 이름은 임의지정.

mappings 는 각자 관리하는 로그의 문자열을 보고 작성해야함. 

아래의 코드를 그대로 삽입하면 정상적으로 동작하지 않을 것.

{
  "index_patterns": ["syslog-*"],
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0,
    "index.refresh_interval": "5s"
  },
  "mappings": {
    "properties": {
      "@timestamp": {
        "type": "date"
      },
      "source_host": {
        "type": "keyword"
      },
      "hostname": {
        "type": "keyword"
      },
      "program": {
        "type": "keyword"
      },
      "pid": {
        "type": "integer"
      },
      "log_message": {
        "type": "text",
        "analyzer": "standard"
      },
      "message": {
        "type": "text",
        "analyzer": "standard"
      },
      "timestamp": {
        "type": "keyword"
      },
      "index_date": {
        "type": "keyword"
      },
      "type": {
        "type": "keyword"
      },
      "tags": {
        "type": "keyword"
      }
    }
  }
}


 


6. pipelines.yml 설정 (필수 아님!)

piplines.yml 은 따로 설정하지 않아도 괜찮다.

추후에 여러 서버의 로그에 대해 각각 처리하기 위해 생성해놨다.

목적에 따라서 굳이 없어도 되는 파일.

- pipeline.id: main
  path.config: "/etc/logstash/conf.d/*.conf"


혹시 다수의 서버에서 오는 로그에 대해 각각 다르게 처리하고 싶다면 다음을 참고해서 작성하면 된다.

- pipeline.id: from_A_server
  path.config: "/etc/logstash/pipelines/a_server.conf"

- pipeline.id: from_B_server
  path.config: "/etc/logstash/pipelines/b_server.conf"

- pipeline.id: from_C_server
  path.config: "/etc/logstash/pipelines/c_server.conf"



7. logstash.yml 설정

path.data: /var/lib/logstash
path.config: /etc/logstash/conf.d/*.conf
path.logs: /var/log/logstash




8. 서비스 활성화

sudo systemctl enable logstash



9. 권한 설정
Logstash가 syslog-ng 로그 파일을 읽을 수 있도록 권한을 설정. 

내 경우, 설치과정에서 권한문제로 수 차례 오류가 발생했다.

# logstash 사용자를 syslog 그룹에 추가
sudo usermod -a -G syslog logstash

# 로그 디렉토리 권한 설정 (syslog 의 설정에서 /var/HOSTS 하위에 로그를 쌓도록 해놨음)
sudo chmod -R 755 /var/HOSTS
sudo chown -R syslog:syslog /var/HOSTS

# Logstash sincedb 디렉토리 권한 설정
sudo mkdir -p /var/lib/logstash
sudo chown -R logstash:logstash /var/lib/logstash


  
10. 설정 파일 문법 검사

sudo -u logstash /usr/share/logstash/bin/logstash --path.settings /etc/logstash -t



11. 서비스 시작

sudo systemctl start logstash
sudo systemctl status logstash



12. 로그 확인

sudo tail -f /var/log/logstash/logstash-plain.log
반응형

'LINUX' 카테고리의 다른 글

[CentOS 9] Kibana 데이터 연동  (0) 2025.06.18
[CentOS 9] Kibana 설치  (0) 2025.06.17
[CentOS 9] Elasticsearch 7.1.0 설치  (2) 2025.06.11
[CentOS 9] syslog-ng 설치  (0) 2025.06.10
[LINUX]리눅스 명령어  (0) 2021.03.19