Fluentd + OpenSearch를 결합하여 syslog를 수집하는 시스템을 구축하는 내용에 대한 기록입니다.
기본 문법은 아래와 같은 형태입니다.
${PATTERN_NAME:FIELD_NAME[:DATA_TYPE]}
Logstash에서는 DATA_TYPE을 지정할 수 있는 항목이 없습니다.
필요한 Fluentd 플러그인을 추가로 설치해야 합니다. Grok 패턴을 이용하기 위한 Grok parser 플러그인과 OpenSearch 플러그인을 추가로 설치합니다.
$ sudo gem install fluent-plugin-grok-parser
$ sudo gem install fluent-plugin-opensearch
<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>
<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에 데이터를 저장하기 위해서는 먼저 인덱스와 mapping을 정의하는 과정이 필요합니다. mapping에는 Dynamic mapping과 Explicit mapping이 있으며 이 글에서는 Explicit mapping 방식으로 인덱스 템플릿을 정의하는 방법을 다룹니다.
참고로 Elasticsearch도 동일합니다.
{
"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"
}
}
}
}
}
PUT https://localhost:9200/_index_template/log_template
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
설정이 다 마무리 되었으니 이제 Fluentd를 구동시킵니다. 각자 Fluentd를 설치한 방식에 맞는 실행 방법으로 Fluentd를 구동합니다. 저 같은 경우는 Fluentd를 소스코드로 빌드하여 설치하고 systemd 서비스로 별도로 등록했기 때문에 아래와 같이 실행시켰습니다.
$ sudo systemctl start fluentd
OpenSearch에 로그가 잘 적재되었는지 확인합니다. OpenSearch 대시보드를 돌리고 있다면 http://localhost:5601/ 에서 데이터를 확인해볼 수 있습니다.
참고로 OpenSearch의 초기 관리자 계정은 admin/admin 입니다.