Fluentd + OpenSearch 로그 모니터링 시스템 구축기

Minsoo, Kim·2023년 1월 18일
0

Logging

목록 보기
2/4
post-thumbnail

개요

Fluentd + OpenSearch를 결합하여 syslog를 수집하는 시스템을 구축하는 내용에 대한 기록입니다.

준비물

  • Ubuntu 20.04.5 LTS
  • Fluentd가 설치된 환경 (버전 : v1.15.3)
  • OpenSearch가 설치된 환경 (버전 : v2.4.1)

시스템 관련 디렉토리 정보

  • 타켓 로그파일 : /var/log/syslog (rsyslog 데몬의 설정을 참고합니다. /etc/rsyslog.d/50-default.conf)
  • Fluentd 설정파일 : /etc/fluentd/fluent.conf
  • Fluentd 로그 관리용 디렉토리 : /var/log/fluentd

로그 파싱 전략 (syslog 한정)

  • 로그 파싱은 Grok pattern을 활용합니다.
  • syslog 구조 파악
    • 시간, 호스트명, 프로세스명, 프로세스 아이디, 로그 본문으로 구분할 수 있습니다.
    • 특수문자는 별도로 escape 처리가 필요할 수 있습니다.

Grok Pattern

기본 문법은 아래와 같은 형태입니다.

${PATTERN_NAME:FIELD_NAME[:DATA_TYPE]}
  • PATTERN_NAME에는 정의되어 있는 Grok 패턴명을 지정합니다.
  • FIELD_NAME에는 패턴에 매치하는 값이 어떤 항목에 저장할지 지정합니다.
  • DATA_TYPE에는 매치된 값의 데이터 유형을 지정합니다. 생략 가능하며, 생략할 경우 기본 string으로 지정됩니다.

    Logstash에서는 DATA_TYPE을 지정할 수 있는 항목이 없습니다.

환경 설정

1. Fluentd 파트

Fluentd 플러그인 설치

필요한 Fluentd 플러그인을 추가로 설치해야 합니다. Grok 패턴을 이용하기 위한 Grok parser 플러그인과 OpenSearch 플러그인을 추가로 설치합니다.

$ sudo gem install fluent-plugin-grok-parser
$ sudo gem install fluent-plugin-opensearch
Fluentd 설정 - input
<source>
  @type tail
  path /var/log/syslog
  pos_file /var/log/fluentd/syslog-access.log.pos
  tag syslog
  refresh_interval 3
  read_from_head false
  <parse>
    @type grok
    <grok>
      pattern %{SYSLOGTIMESTAMP:time:string}\s+%{SYSLOGHOST:hostname:string}\s+%{PROG:process:string}\[%{POSINT:pid:integer}\]:\s+%{GREEDYDATA:message:string}
    </grok>
  </parse>
</source>
  • 로그를 읽어오기 위해 tail 플러그인을 사용합니다. (https://docs.fluentd.org/input/tail)
  • path에는 읽어올 로그파일 경로를 지정합니다. 와일드카드를 이용하여 다수의 로그파일 지정도 가능합니다.
  • pos_file에는 현재까지 읽은 로그의 위치정보를 저장할 파일 경로를 지정합니다.
  • 추가로 Grok 패턴을 적용하기 위해 Grok parser를 설정합니다. (https://github.com/fluent/fluent-plugin-grok-parser)
  • pattern 값은 syslog 분석을 토대로 Grok 패턴식을 작성합니다. 특수문자는 escape 해야하며, 공백을 인식할 수 있도록 white space 정규식도 넣어줍니다.
Fluentd 설정 - output
<match syslog.**>
  @type opensearch
  host localhost
  port 9200
  user admin
  password admin
  scheme https
  ssl_verify false
  logstash_format true
  logstash_prefix log
  logstash_prefix_separator -
</match>
  • OpenSearch를 사용하기 위해 OpenSearch 플러그인을 설정합니다. (https://github.com/fluent/fluent-plugin-opensearch)
  • OpenSearch 접속 정보를 지정합니다.
  • logstash_format을 활성화 하고 로그 데이터를 저장할 인덱스 이름의 prefix와 구분자를 지정합니다.

2. OpenSearch 파트

Index Template 정의하기

OpenSearch에 데이터를 저장하기 위해서는 먼저 인덱스와 mapping을 정의하는 과정이 필요합니다. mapping에는 Dynamic mapping과 Explicit mapping이 있으며 이 글에서는 Explicit mapping 방식으로 인덱스 템플릿을 정의하는 방법을 다룹니다.

참고로 Elasticsearch도 동일합니다.

  • 생성할 인덱스 템플릿을 json으로 작성합니다.
{
  "index_patterns": ["logs-*"],
  "template": {
    "aliases": {
      "logs": {}
    },
    "settings": {
      "number_of_shards": 2,
      "number_of_replicas": 1
    },
    "mappings": {
      "properties": {
        "hostname": {
          "type": "keyword"
        },
        "process": {
          "type": "keyword"
        },
        "pid": {
          "type": "integer"
        },
        "time": {
          "type": "date"
        },
        "@timestamp": {
          "type": "date"
        },
        "message": {
          "type": "text"
        }
      }
    }
  }
}
  • OpenSearch REST API를 이용해서 작성한 json을 템플릿으로 등록합니다. 저는 크롬 확장 프로그램인 Talend API Tester를 활용했습니다.
PUT https://localhost:9200/_index_template/log_template

Talend API Tester

3. rsyslog 파트

syslog파일은 640 권한으로 설정되어 있어서 root나 syslog 유저 외에는 파일을 읽을 수가 없습니다. 때문에 Fluentd가 syslog파일을 읽을 수 있도록 읽기 권한을 추가하는 과정이 필요합니다.

$ sudo chmod +r /var/log/syslog

추가로 rsyslog 설정에서 syslog 파일의 권한을 설정할 수 있습니다. /etc/rsyslog.conf 파일을 열어 FileCreateMode를 640에서 644로 수정합니다.

#
# Set the default permissions for all log files.
#
$FileOwner syslog
$FileGroup adm
$FileCreateMode 0644
$DirCreateMode 0755
$Umask 0022
$PrivDropToUser syslog
$PrivDropToGroup syslog

Run

설정이 다 마무리 되었으니 이제 Fluentd를 구동시킵니다. 각자 Fluentd를 설치한 방식에 맞는 실행 방법으로 Fluentd를 구동합니다. 저 같은 경우는 Fluentd를 소스코드로 빌드하여 설치하고 systemd 서비스로 별도로 등록했기 때문에 아래와 같이 실행시켰습니다.

$ sudo systemctl start fluentd

로그 데이터 확인

OpenSearch에 로그가 잘 적재되었는지 확인합니다. OpenSearch 대시보드를 돌리고 있다면 http://localhost:5601/ 에서 데이터를 확인해볼 수 있습니다.

참고로 OpenSearch의 초기 관리자 계정은 admin/admin 입니다.

0개의 댓글