본문 바로가기

Monitoring Tools/ELK Stack

rsyslog + elasticsearch, logstash, filebeat 등 로그 indexing의 3가지 방법

반응형

 

개요


Rsyslog로 수집되는 Log를 elasticsearch로 indexing 하는 방법

 

  • 방법은 여러가지가 있겠지만 간단히 아래 3개지 방법으로 indexing이 가능할 것 같다.
    • rsyslog로 수집하는 로그를 json으로 변환하고 rsyslog omelasticsearch 모듈을 이용하여 elasticsearch 에 indexing.
    • rsyslog omfwd 모듈을 이용하여 logstash로 포워드
    • omfile 모듈을 이용하여 file log를 쌓고 filebeat로 수집

 

  • 여기서는 DELL EMC SAN Storage 의 로그를 수집하는 것이 목적으로 아래 내용과 크게 상관이 없을 수 있다.

 

설정


 

DELL EMC SAN Storage Log 설정

  • facility, priority 등의 설정은 없고 syslog 로그수집 호스트 설정만 있다.
  • 실제로 특정 facility에 국한되어 들어오지 않고 ntp, daemon, user 등 다양한 타입으로 전송된다.

 

rsyslog json log format template 설정

  • template option "option.jsonf="on"" 을 사용하지 않고 직접(?) json 형식을 만드는 것으로 했다.
  • constant 로 json 모양과 key값을, property로 실제 값과 옵션등으로 value 를 표출한다.
> /etc/rsyslog.conf

template(name="json_syslog" type="list") {
        constant(value="{")
        constant(value="\"@timestamp\":\"")
        property(name="timereported" dateFormat="rfc3339")
        constant(value="\",\"log_template\":\"json_syslog")
        constant(value="\",\"tag\":\"")
        property(name="syslogtag" format="json")
        constant(value="\",\"relayhost\":\"")
        property(name="fromhost")
        constant(value="\",\"relayip\":\"")
        property(name="fromhost-ip")
        constant(value="\",\"logsource\":\"")
        property(name="source")
        constant(value="\",\"hostname\":\"")
        property(name="hostname" caseconversion="lower")
        constant(value="\",\"program\":\"")
        property(name="programname")
        constant(value="\",\"priority\":\"")
        property(name="pri")
        constant(value="\",\"severity\":\"")
        property(name="syslogseverity")
        constant(value="\",\"facility\":\"")
        property(name="syslogfacility")
        constant(value="\",\"severity_label\":\"")
        property(name="syslogseverity-text")
        constant(value="\",\"facility_label\":\"")
        property(name="syslogfacility-text")
        constant(value="\",\"message\":\"")
        property(name="rawmsg" format="json")
        constant(value="\",\"end_msg\":\"")
        constant(value="\"}\n")
}

 

  • template output json
{
  "@timestamp": "***",
  "log_template": "json_syslog",
  "tag": "phd",
  "relayhost": "10.10.40.216",
  "relayip": "10.10.40.216",
  "logsource": "sn358340",
  "hostname": "sn358340",
  "program": "phd",
  "priority": "15",
  "severity": "7",
  "facility": "1",
  "severity_label": "debug",
  "facility_label": "user",
  "message": "****""
}

 

 

rsyslog elasticsearch module 설치

  • rsyslog 는 elasticsearch module을 제공하고 패키지 관리자를 통해 간단히 설치 가능하다.
yum install rsyslog-elasticsearch

 

  • 설치한 모듈을 로드한다.
> /etc/rsyslog.conf

module(load="omelasticsearch")

 

 

 

rsyslog searchindex template

  • elasticsearch index를 위한 template 설정
  • {index name}-{date} 형식을 위한 template로 분기문 action에서 "dynSearchIndex="on"" 옵션과 같이 사용한다.
> /etc/rsyslog.conf

template(name="elasticsearch-index" type="string" string="sanstorage-%$YEAR%.%$MONTH%.%$DAY%")

 

 

rsyslog 분기문 설정

  • DELL EMC SAN Storage log 는 facility, priority등의 설정이 없어 분기문을 이용하여 san storage에서 오는 로그를 따로 수집할 필요가 있다.
    • 이 경우 hostname이나 fromhost-ip 등으로 분기문을 이용하여 설정한다.(설명은 omelasticsearch 부분 참조)
  • elasticsearch(omelasticsearch), logstash(omfwd), filebeat(omfile) 3가지 방법을 분기문 action을 이용하여 설정 할 수 있다.

 

omelasticsearch

  • elasticsearch로 바로 indexing 하는 방법
  • uid : elasticsearch user
  • pwd : elasticsearch password
  • dynSearchIndex="on" : 이옵션을 searchIndex를 string으로 사용 할건지 위에서 만든 template name "elasticsearch-index"를 사용할 건지를 결정한다.
  • omelasticsearch 모듈의 설명은 https://www.rsyslog.com/doc/v8-stable/configuration/modules/omelasticsearch.html 을 참조
> /etc/rsyslog.conf

# hostname 이용
if $hostname == 'sn358340' then {
        action(type="omelasticsearch" server="localhost" serverport="9200" template="json_syslog" searchIndex="elasticsearch-index" uid="elastic" pwd="alxndhs" dynSearchIndex="on")
}

# fromhost-ip 이용
if $fromhost-ip == '10.10.40.216' then { 
        action(type="omelasticsearch" server="localhost" serverport="9200" template="json_syslog" searchIndex="elasticsearch-index" uid="***" pwd="***" dynSearchIndex="on")
}

 

omfwd

if $hostname == 'sn358340' then {
	action(type="omfwd" target="localhost" port="5044" protocol="tcp" template="json_syslog")
}

 

omfile

if $hostname == 'sn358340' then {
        action(type="omfile" file="/var/log/san_storage.log" template="json_syslog")
}

 

반응형