아무거나

ELK 설치 본문

Data Store/Elastic Stack

ELK 설치

전봉근 2019. 5. 2. 11:30
반응형

logstash (https://www.elastic.co/kr/products/logstash)

Logstash

"Logstash는 오픈소스 서버측 데이터 처리 파이프라인으로, 다양한 소스에서 동시에 데이터를 수집(Ingest)하여 변환한 후 자주 사용하는 "스태쉬(Stash)-보관소"로 보냅니다. (여기서는 당연히 Elasticsearch입니다.)"

현재 설명하고자하는 기본 목적은 로그분석 [ CloudFront Access Log ]를 기반으로 합니다. 

Logstash보다 데이터 수집에 목적을 맞춰 경량화 및 다양한 제품으로 구성된 Beats가 있으며 Filebeat, Metricbeat, Packetbeat, Winlogbeat, Heartbeat가 있습니다.

파이프라인으로 Input plugins, Output plugins, Filter plugins, Codec plugins을 다양한 조합으로 사용할 수 있습니다.

 

[logstash config]

input{
        file {
                path => "/home/logs/cafe-cf-access-log/*"
                type => "cloudfront"
                start_position => "beginning"
                sincedb_path => "/dev/null"
        }
}
filter{
        if [type] == "cloudfront" {
                if ( ( [message] =~ "#Version: 1.0" ) or ( [message] =~ "#Fields: date" )) {
                        drop {}
                }
        }
        grok {
                match => { "message" => "%{DATE_EU:date}\t%{TIME:time}\t%{WORD:x_edge_location}\t(?:%{NUMBER:sc_bytes}|-)\t%{IPORHOST:c_ip}\t%{WORD:cs_method}\t%{HOSTNAME:cs_host}\t%{NOTSPACE:cs_uri}\t%{NUMBER:sc_status}\t%{GREEDYDATA:referrer}\t%{GREEDYDATA:User_Agent}\t%{GREEDYDATA:cs_uri_stem}\t%{GREEDYDATA:cookies}\t%{WORD:x_edge_result_type}\t%{NOTSPACE:x_edge_request_id}\t%{HOSTNAME:x_host_header}\t%{URIPROTO:cs_protocol}\t%{INT:cs_bytes}\t%{GREEDYDATA:time_taken}\t%{GREEDYDATA:x_forwarded_for}\t%{GREEDYDATA:ssl_protocol}\t%{GREEDYDATA:ssl_cipher}\t%{GREEDYDATA:x_edge_response_result_type}" }
        }
        mutate {
                gsub => [ "%{User_Agent}", "\%2520\g", " " ]
                add_field => [ "received_at", "%{@timestamp}" ]
                add_field => [ "listener_timestamp", "%{date} %{time}" ]
        }
        date {
                match => [ "listener_timestamp", "yy-MM-dd HH:mm:ss" ]
                timezone => "Asia/Seoul"
        }
        grok{
                match => { "listener_timestamp" => "%{TIME:t_time}" }
        }
        useragent {
                source => "User_Agent"
                target => "useragent"
        }
        geoip {
                source => "c_ip"
                target => "geoip"
                add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
                add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}"  ]
        }
       mutate {
                convert => [ "[geoip][coordinates]", "float"]
                split => ["t_time", ":"]
                add_field => {
                        "group_time" => "%{t_time[0]}"
                }
        }
        if [referrer] {
                grok {
                         match => { "referrer" => "%{URIPARAM:referrer_querystring}" }
                                tag_on_failure => []
                 }
                 mutate {
                        gsub => [ "referrer_querystring", "\?", "" ]
                 }
                 kv {
                        source => 'referrer_querystring'
                        field_split => '&'
                        target => 'referrer_queryparams'
                }
        }
}

output {
        elasticsearch {
                hosts => ["localhost:9200"]
                index => "cloudfront"
        }
        stdout { codec => rubydebug }
}

 

 

 

ElasticSearch (https://www.elastic.co/kr/products/elasticsearch)

"Elasticsearch는 점점 많은 문제를 해결하는 분산형 RESTful 검색 및 분석 엔진입니다."

Logstash로 받은 Data를 저장, Kibana를 통한 Data 시각화를 도와준다.

geoip 및 시간대 별 Grouping을 위해서 다이나믹템플릿을 사용하지 않고 별로도 정의된 템플릿을 사용한다.

추후 성능을 위해서 template을 튜닝해야한다.

[ElasticSearch template]

curl -XPUT 'localhost:9200/_template/cloudfront?pretty' -d'
{
 "template" : "cloudfront",
 "mappings": {
        "cloudfront": {
            "properties": {
                "geoip": {
                    "properties": {
                        "location": {
                            "type": "geo_point"
                        }
                    }
                },
                "group_time": { "type": "integer" }
            }
        }
    }
}'

 

 

Kibana

"Kibana는 Elasticsearch 데이터를 시각화하고 Elastic Stack의 탐색을 지원"

데이터를 정제/시각화 하는 역활을 하며 다양한 기능들을 가지고 있다.

Grouping될수 있는 Type은 날짜, 숫자 유형이 가능하며 Range은 날짜, 숫자, IPv4가 가능하다.

 

 

유의사항

root 계정으로 설치/실행하지 말 것

host 설정은 0.0.0.0으로 설정할 것

보안을 위해서는 x-pack을 설치해야하나 비용이 발생

x-pack을 사용하지 않을 경우

대외 오픈을 하지 않을 것

대외 오픈을 해야 할 경우 getaway를 통해 오픈할 것

kibana를 통해 시각화할 경우 시각화할 대상에 대한 template에 대한 정확한 정의가 필요

 

설치) https://okdevtv.com/mib/elk/elk5

logstash/ cloudfront log pattern) https://logstash.jira.com/browse/LOGSTASH-1550

logstash/ grok Default pattern ) https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns 

반응형
Comments