ELK 설치 하고 실습 하기 4- logstash 와 Filebeats 그리고 Elasticsearch 가지고 놀기

2017. 6. 16. 17:21DB&NoSQL/Elasticsearch,ELK

logstash 와 Filebeats 그리고 Elasticsearch 가지고 놀기


*주의!!!
이 문서는 ELK에 있는 getting started Guide을 되는대로 번역을 해 놓은 것입니다. (장담할수없어요.. 참고만 하세요)


    • Parsing logs with logstash

      • 위에서는 기본 Logstash pipeline 을 생성해 봤다. 이유는 우리의 Logstash 셋업을 테스트 하기 위해서였다.
        실상에서, Logstash pipeline은 좀 더 복잡합니다.(하나 이상의 input,filter, output 플러그인을 가지고 있기때문이다)
      • 이제부터는 Filebeat를 사용하는 Logstash pipeline을 생성합니다.
      •  input으로 Apache web log를 사용하기 위해 Filebeat를 사용하고, 
        이 로그들을 명확하기 만들기 위해 파싱하고, 로그들로 부터 필드들을 명명하고,
        파싱된 데이터를 Elasticsearch cluster에 작성합니다. 
      • pipeline configuration을 command line에서 정의하는 것보다,config 파일엔에 Pipeline을 정의 하는 것이 더 낫습니다.
      • sample data : https://download.elastic.co/demos/logstash/gettingstarted/logstash-tutorial.log.gz

      • Configuring Fielbeat to send log lines to Logstash
        • Logstash pipeline를 생성하기 전에, 여러분은 Logstash에 로그라인들을 보내기 위해 , Filebeat를 설정합니다.
        • Filebeat 클라이언트는 가볍고,  서버에 있는 파일들로 부터 로그를 수집하고,
          Logstash 인스턴스에 프로세싱하기 위해 이들 로그들을 전달하는 resource-friendly 툴입니다.
        • Filebeat는 reliability 하고 low latency 을 위해 설계 되었습니다.
        • Filebeat는 Host System에 대한 리소스가 적고,
          "Beats input" 플러그인은 Logstash 인스턴스에 대한 리소스 요구를 최소화합니다.
          (기본 Logstash 설치에 "Beats input" 플러그인이 포함되어 있습니다.)
        • 일반적으로 Filebeat은 Logstash 인스턴스가 동작하는 머신으로 부터  분리된 머신에서 동작합니다.  
          (여기선 예시로 같은 머신에서 동작하는 걸로 갑니다.)
        • Beats input 플러그인은 Beats framework와 동작하기 위해 작성한 어떠한 Beat를 의미하는 
          Elasticsearch framework 로부터 이벤트를 받기 위한 Logstash를 가능하게 합니다.
          예로 Packetbeat, Metricbeat들은 Logstash에 이벤트를 데이터를 보낼수 있습니다.
        • 여러분의 data source machine에 Filebeat를 설치하기 위해서는 아래에서 다운로드 받아야 합니다.
        • 다운로드 : https://www.elastic.co/downloads/beats/filebeat
          • filebeat.yml configuration file 수정
            sudo filebeat -e -c filebeat.yml 으로 기동
        • filebeat.yml 에 아래와 같이 수정한다. (반드시 하나씩 보면서 수정해야 합니다.) 
          filebeat.prospectors:
          - input_type: log
            paths:
              - /path/to/file/logstash-tutorial.log 
          output.logstash:
            hosts: ["localhost:5043"]
        • 그 다음 실행 해봅시다.

          sudo ./filebeat -e -c filebeat.yml -d "publish"

        • Filebeat는 5042 포트에 연결을 시도할것입니다.
          Logstash가 active Beats plugin으로 시작할 때까진, 해당 포트에 어떤 응답이 없으므로 
          , 그 포트에 연결하지 못했다는 메시지는 지금 당장은 정상입니다. 

      • Configuring Logstash for Filebeat input

        • Beats로 부터 이벤트를 받기 위한 Beats input plugin를 사용하는 Logstash configuration pipeline  를 생성합니다.
          아래는 configuration pipeline의 골격을 나타냅니다.

          # The # character at the beginning of a line indicates a comment. Use
          # comments to describe your configuration.
          input {
          }
          # The filter part of this file is commented out to indicate that it is
          # optional.
          # filter {
          #
          # }
          output {
          }
        • 이 골격은 아무기능이 없는 넘입니다.
          이유는 input 과 output 섹션들이 정의된 유효한 옵션(valid options defined)를 갖고 있지 않기 때문입니다. 
          시작하기 위해서는, 위의 configuration pipeline을 first-pipeline.conf 파일에 붙여 넣고, 저장합니다.
          (Logstash directory 에)

        • 위 파일에 input 영역에 아래 라인을 추가해서, Beats input plugin을 사용하기 위한 Logstash instance를 구성합니다.

            beats {
                  port => "5043"
              }
        • 후에 Elasticsearch에 작성하기 위한 Logstash를 구성할 것입니다.
          output 영역에는 아래 내용을 추가 합니다. 
          Logstash가 기동할때, ouptut이 "stdout"에 출력될수 있게 말이죠

            stdout { codec => rubydebug }
        • 여러분의 설정을 검증하기 위해서, 아래 명령으로 기동시켜 봅시다.

          bin/logstash -f first-pipeline.conf --config.test_and_exit
        • "--config.test_and_exit" 옵션은 여러분의 설정파일을 파싱하고 에러들을 리포팅 합니다.
        • 이상없으면 아래 명령어로 시작.

          bin/logstash -f first-pipeline.conf --config.reload.automatic
        • "--config.reload.automatic" 옵션은 자동으로 config를 재로딩하도록 하는 것입니다.
          configuration file을 수정할때마다 매번 Logstash를 재기동 할 필요가 없도록 하기 위해서죠

        • pipeline 이 정상적으로 동작하면, 콘솔에 작성된 아래와 같은 이벤트 시리즈들을 볼수 있습니다.

          {
              "@timestamp" => 2016-10-11T20:54:06.733Z,
                  "offset" => 325,
                "@version" => "1",
                    "beat" => {
                  "hostname" => "My-MacBook-Pro.local",
                      "name" => "My-MacBook-Pro.local"
              },
              "input_type" => "log",
                    "host" => "My-MacBook-Pro.local",
                  "source" => "/path/to/file/logstash-tutorial.log",
                 "message" => "83.149.9.216 - - [04/Jan/2015:05:13:42 +0000] \"GET /presentations/logstash-monitorama-2013/images/kibana-search.png HTTP/1.1\" 200 203023 \"http://semicomplete.com/presentations/logstash-monitorama-2013/\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"",
                    "type" => "log",
                    "tags" => [
                  [0] "beats_input_codec_plain_applied"
              ]
          }
          ...


    • Parsing web Logs with the Grok filter Plugin
      • 지금 Filebeat에서 log lines를 읽는 운영 pipeline을 갖고 있습니다.
        그러나, 여러분은 log message의 포멧이 맘에 들지 않네요.
        로그에서 특정한 이름의 필드들을 생성하기 위한 로그 메시지들을 파싱하고자 합니다.
      • grok 필터 플러그인은 Logstash에 기본으로 제공되는 플러그인 중에 하나입니다.
        grok 필터 플러그인은 여러분이 비구조적인 로그 데이터를 구조적인 뭔가로, 쿼리가능하게 파싱하는 것으로 가능하게 합니다.
      • grok 필터 플러그인은 유입로그데이터에 패턴을 찾기 때문에,
        플러그인을 설정하는 것은 여러분에게 패턴을 구분할수 있는 방법에 대한 의견을 요구 합니다. 
      • 웹 서버 로그 예제로 부터 대표적인 라인은 아래와 같습니다.

        83.149.9.216 - - [04/Jan/2015:05:13:42 +0000] "GET /presentations/logstash-monitorama-2013/images/kibana-search.png
        HTTP/1.1" 200 203023 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel
        Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"
      • 라인을 시작하는곳에 IP 주소는 구별하기 쉽습니다.
        [] 안에는 timestamp가 있습니다.
        데이터를 파싱하기 위해서, 여러분은
        아래 스키마를 사용한 Apache log로 부터 라인을 구성하는 
        %{COMBINEDAPACHELOG} grok patter을 사용할수 있습니다. 

        Information

        Field Name

        IP Address

        clientip

        User ID

        ident

        User Authentication

        auth

        timestamp

        timestamp

        HTTP Verb

        verb

        Request body

        request

        HTTP Version

        httpversion

        HTTP Status Code

        response

        Bytes served

        bytes

        Referrer URL

        referrer

        User agent

        agent
      • fisrt-pipeline.conf 파일에 아래  filter 부분을 추가 하도록 합시다.

        input {
            beats {
                port => "5043"
            }
        }
        filter {
            grok {
                match => { "message" => "%{COMBINEDAPACHELOG}"}
            }
        }
        output {
            stdout { codec => rubydebug }
        }
      • 저장합니다. 자동 저장해 놔서, 바로 반영됩니다.
        그러나, scratch로 부터 파일을 읽기 위해 FileBeat를 강제할 필요가 있습니다.
        이걸 하기 위해서 Filebeat terminal window에 가서 Ctrl+C 누르고 셧다운 시킵니다. 
      • Filebeat registry file을 지웁니다.

        sudo rm data/registry
      • Filebeat가 레지스트리에서 수확한 각 파일의 단계를 저장한 후에, 레지스트리 파일을 삭제하는 것은 Filebeat를 scratch로 부터 수확하고 있는 모든 파일들을 읽기위해 강제합니다.
      • 다시 재시작 합니다.
         
        sudo ./filebeat -e -c filebeat.yml -d "publish"
      • grok 패턴을 가지고 로그파일 처리한 후에, 이벤트는 아래 표현으로 나타날것입니다.
        {
                "request" => "/presentations/logstash-monitorama-2013/images/kibana-search.png",
                  "agent" => "\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"",
                 "offset" => 325,
                   "auth" => "-",
                  "ident" => "-",
             "input_type" => "log",
                   "verb" => "GET",
                 "source" => "/path/to/file/logstash-tutorial.log",
                "message" => "83.149.9.216 - - [04/Jan/2015:05:13:42 +0000] \"GET /presentations/logstash-monitorama-2013/images/kibana-search.png HTTP/1.1\" 200 203023 \"http://semicomplete.com/presentations/logstash-monitorama-2013/\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"",
                   "type" => "log",
                   "tags" => [
                [0] "beats_input_codec_plain_applied"
            ],
               "referrer" => "\"http://semicomplete.com/presentations/logstash-monitorama-2013/\"",
             "@timestamp" => 2016-10-11T21:04:36.167Z,
               "response" => "200",
                  "bytes" => "203023",
               "clientip" => "83.149.9.216",
               "@version" => "1",
                   "beat" => {
                "hostname" => "My-MacBook-Pro.local",
                    "name" => "My-MacBook-Pro.local"
            },
                   "host" => "My-MacBook-Pro.local",
            "httpversion" => "1.1",
              "timestamp" => "04/Jan/2015:05:13:42 +0000"
        }
      • 이벤트는 오리지널 메시지를 포함하지만 로그 메시지는 특정 필드들로 나눠진다는 점 기억해 둬라.

    • Enhancing Your data with the Geoip Filter Plugin

      • 보다 나은 검색을 위해 로그 데이터를 파싱하는 것에 추가적으로 
        필터 플러그인은 존재하는 데이터로 부터 추가적인 정보를 얻어 낼수 있습니다.
        예제로 , geoip 플러그인은 IP 주소들을 검색하고, 지도 위치 정보를 주소로부터 이끌어 내고
        로그들에 위치 정보를 추가합니다.
      • 여러분의 Logstash 인스턴스를 구성해봅시다.
        geoip 필터 플러그인을 사용하기 위해, 아래 내용을 추가해보세요

        geoip {
                source => "clientip"
            }
      • geoip 플러그인 구성은 여러분에게 검색을 위해 IP 주소가 포함된 소스 필드 이름을 명시하는 것이 필요합니다.
        이 예제에서는 Clientip 필드가 IP 주소를 포함하고 있습니다.
      • 필터들은 순서대로 평가한후에, geoip 섹션이 구성파일의 grok 섹션 뒤에 있도록 하고, grop 과 geoip 센션 둘다 filter 섹션 안에 위치하도록 합니다.
        다시 정리해서 작성 하면 아래와 같습니다.

        input {
            beats {
                port => "5043"
            }
        }
         filter {
            grok {
                match => { "message" => "%{COMBINEDAPACHELOG}"}
            }
            geoip {
                source => "clientip"
            }
        }
        output {
            stdout { codec => rubydebug }
        }
      • 바뀐걸 저장합니다.
        scratch로 부터 로그를 FileBeat가 읽도록 강제하기 위해서, Filebeat를 셧다운 하고,  registry 파일을 지워야 합니다. 그 다음에 Filebeat을 재 시작 해야 합니다.

        sudo ./filebeat -e -c filebeat.yml -d "publish"
      • 이벤트는 지금 지리 위치 정보를 포함하고 있는 것을 확인 할 수 있습니다.

        {
                "request" => "/presentations/logstash-monitorama-2013/images/kibana-search.png",
                  "agent" => "\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"",
                  "geoip" => {
                      "timezone" => "Europe/Moscow",
                            "ip" => "83.149.9.216",
                      "latitude" => 55.7522,
                "continent_code" => "EU",
                     "city_name" => "Moscow",
                 "country_code2" => "RU",
                  "country_name" => "Russia",
                      "dma_code" => nil,
                 "country_code3" => "RU",
                   "region_name" => "Moscow",
                      "location" => [
                    [0] 37.6156,
                    [1] 55.7522
                ],
                   "postal_code" => "101194",
                     "longitude" => 37.6156,
                   "region_code" => "MOW"
            },
            ...
    • Indexing Your Data into Elasticsearch
      • 웹 로그는 특정 필드로 잘 쪼개졌고, Logstash pipeline 은 Elasticsearch cluster안에 데이터를 인덱스 할수 있습니다.
      • first-pipeline.conf 파일을 수정하고, output을 바꿔봅시다.

        output {
            elasticsearch {
                hosts => [ "localhost:9200" ]
            }
        }
        

          • 위 구성을 가지고 Logstash는 http protocol을 Elasticsearch에 연결하기 위해 사용됩니다.
            위의 예제에서는 Logstash와 Elasticsearch가 같은 인스턴스안에서 동작한다고 가정합니다.
          • hosts => ["es-machine:9092"] 과 같은 것으로 hosts 설정을 사용해서 원격 Elasticsearch 인스턴스를 명시할수 있습니다.
          • 여기서, first-pipeline.conf 파일은 input, filter, output 섹션을 적절하게 구성되어진 아래와 같은 형태로 정리합니다.

            input {
                beats {
                    port => "5043"
                }
            }
             filter {
                grok {
                    match => { "message" => "%{COMBINEDAPACHELOG}"}
                }
                geoip {
                    source => "clientip"
                }
            }
            output {
                elasticsearch {
                    hosts => [ "localhost:9200" ]
                }
            }
            


          • 저장하고, scrach 에서 강제로 로그 파일을 읽게 해봅시다.
            위에서 한번 했죠. registry 파일을 지우고, 재시작 하기

        • Testing Your pipeline
          • Elasticsearch 클러스터안에 데이터를 인덱싱 하기 위해 Logstash pipeline을 구성했으니,
            이제 Elasticsearch에서 쿼리 할수 있습니다.
          • grok 필터 플러그인을  통해 생성한 필드들을 기반으로 Elasticsearch 에 쿼리 테스트를 해봅시다.
          • $DATE를 현재 날짜(YYYY.MM.DD)로 바꾸어 봅시다.

            curl -XGET 'localhost:9200/logstash-$DATE/_search?pretty&q=response=200'
            


          • 인덱스 이름으로 사용되는 date는 UTC에 기반하고, Logstash가 동작하는 곳에 timezone이 아니다.
            위 쿼리에서 index_not_found_exception 이 나오면, logstash-$DATE 를 실제 인덱스 이름으로 반영하는 것을 확실하게 하세요.
            인덱스 확인해보려면 curl 'localhost:9200/_cat/indices?v' 해보시구요
          • 결과 값은 아래와 같이 잘 나오겠죠?

            {
              "took" : 21,
              "timed_out" : false,
              "_shards" : {
                "total" : 5,
                "successful" : 5,
                "failed" : 0
              },
              "hits" : {
                "total" : 98,
                "max_score" : 3.745223,
                "hits" : [
                  {
                    "_index" : "logstash-2016.10.11",
                    "_type" : "log",
                    "_id" : "AVe14gMiYMkU36o_eVsA",
                    "_score" : 3.745223,
                    "_source" : {
                      "request" : "/presentations/logstash-monitorama-2013/images/frontend-response-codes.png",
                      "agent" : "\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"",
                      "geoip" : {
                        "timezone" : "Europe/Moscow",
                        "ip" : "83.149.9.216",
                        "latitude" : 55.7522,
                        "continent_code" : "EU",
                        "city_name" : "Moscow",
                        "country_code2" : "RU",
                        "country_name" : "Russia",
                        "dma_code" : null,
                        "country_code3" : "RU",
                        "region_name" : "Moscow",
                        "location" : [
                          37.6156,
                          55.7522
                        ],
                        "postal_code" : "101194",
                        "longitude" : 37.6156,
                        "region_code" : "MOW"
                      },
                      "offset" : 2932,
                      "auth" : "-",
                      "ident" : "-",
                      "input_type" : "log",
                      "verb" : "GET",
                      "source" : "/path/to/file/logstash-tutorial.log",
                      "message" : "83.149.9.216 - - [04/Jan/2015:05:13:45 +0000] \"GET /presentations/logstash-monitorama-2013/images/frontend-response-codes.png HTTP/1.1\" 200 52878 \"http://semicomplete.com/presentations/logstash-monitorama-2013/\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"",
                      "type" : "log",
                      "tags" : [
                        "beats_input_codec_plain_applied"
                      ],
                      "referrer" : "\"http://semicomplete.com/presentations/logstash-monitorama-2013/\"",
                      "@timestamp" : "2016-10-11T22:34:25.317Z",
                      "response" : "200",
                      "bytes" : "52878",
                      "clientip" : "83.149.9.216",
                      "@version" : "1",
                      "beat" : {
                        "hostname" : "My-MacBook-Pro.local",
                        "name" : "My-MacBook-Pro.local"
                      },
                      "host" : "My-MacBook-Pro.local",
                      "httpversion" : "1.1",
                      "timestamp" : "04/Jan/2015:05:13:45 +0000"
                    }
                  }
                },
                ...
            


          •  IP주소 정보로 부터 추출한 지리정보를 검색하는 것을 해봅시다. 

            curl -XGET 'localhost:9200/logstash-$DATE/_search?pretty&q=geoip.city_name=Buffalo'
            



          • Buffalo에서 온 로그들이 보입니다. 

            {
              "took" : 3,
              "timed_out" : false,
              "_shards" : {
                "total" : 5,
                "successful" : 5,
                "failed" : 0
              },
              "hits" : {
                "total" : 3,
                "max_score" : 2.6390574,
                "hits" : [
                  {
                    "_index" : "logstash-2016.10.11",
                    "_type" : "log",
                    "_id" : "AVe14gMjYMkU36o_eVtO",
                    "_score" : 2.6390574,
                    "_source" : {
                      "request" : "/?flav=rss20",
                      "agent" : "\"-\"",
                      "geoip" : {
                        "timezone" : "America/New_York",
                        "ip" : "108.174.55.234",
                        "latitude" : 42.9864,
                        "continent_code" : "NA",
                        "city_name" : "Buffalo",
                        "country_code2" : "US",
                        "country_name" : "United States",
                        "dma_code" : 514,
                        "country_code3" : "US",
                        "region_name" : "New York",
                        "location" : [
                          -78.7279,
                          42.9864
                        ],
                        "postal_code" : "14221",
                        "longitude" : -78.7279,
                        "region_code" : "NY"
                      },
                      "offset" : 21471,
                      "auth" : "-",
                      "ident" : "-",
                      "input_type" : "log",
                      "verb" : "GET",
                      "source" : "/path/to/file/logstash-tutorial.log",
                      "message" : "108.174.55.234 - - [04/Jan/2015:05:27:45 +0000] \"GET /?flav=rss20 HTTP/1.1\" 200 29941 \"-\" \"-\"",
                      "type" : "log",
                      "tags" : [
                        "beats_input_codec_plain_applied"
                      ],
                      "referrer" : "\"-\"",
                      "@timestamp" : "2016-10-11T22:34:25.318Z",
                      "response" : "200",
                      "bytes" : "29941",
                      "clientip" : "108.174.55.234",
                      "@version" : "1",
                      "beat" : {
                        "hostname" : "My-MacBook-Pro.local",
                        "name" : "My-MacBook-Pro.local"
                      },
                      "host" : "My-MacBook-Pro.local",
                      "httpversion" : "1.1",
                      "timestamp" : "04/Jan/2015:05:27:45 +0000"
                    }
                  },
                 ...
            


          • 우리 데이터를 시각화 하는 Kibana을 사용하고 있다면, Kibana에서도 Filebeat 데이터를 볼수 있습니다.
          • Kibana 인덱스 패턴을 로딩하는 것에 대한 정보를 확인하기 위해선 Filebeat 시작하기 문서를 봐라.
            https://www.elastic.co/guide/en/beats/filebeat/5.4/filebeat-getting-started.html
          •  input으로 Apache web log를 사용하기 위해 Filebeat를 사용하고, 
            이 로그들을 명확하기 만들기 위해 파싱하고, 로그들로 부터 필드들을 명명하고,
            파싱된 데이터를 Elasticsearch cluster에 작성합니다. 
          • 다음에는 멀티 input, output 플러그인을 사용하는 pipeline을 생성하는 방법에 대해서 배워 봅시다.

      • Stitching together multiple input and output Plugins

        • 여러분이 관리할 필요가 있는 정보는 가끔씩은 여러 이기종 소스들로 부터  오고,
          유스 케이스들은 여러분의 데이터에 대해 여러 목적지들을 요구할수 있습니다.
          여러분의 Logstash 파이프라인은 이런 요구들을 다루기 위해, 다중 input 과 output 플러그인을 사용할수 있습니다.
        • 이 섹션에서는 Twitter 피드와 Filebeat 클라이언트로 부터 input을 받는 Logstash 파이프라인을 생성하고,
           파일에 직접 정보를 작성하는 것과 마찬가지로, Elasticsearch 클러스터에 정보를 보내겠습니다.
        • Reading from a Twitter Feed
          • Twitter 피드를 추가하기 위해서 Twitter input 플러그인을 사용하겠습니다.
            플러그인을 구성하기 위해서, 몇가지 정보가 필요합니다.
            - consumer key, Twitter app을  유니크하게 증명하는
            - consumer secret, Twitter app에 대한 비밀번호로써 제공
            - 유입되는 피드들에서 검색하기 위한 하나 또는 그 이상의 keywords.
              예제에서는 "cloud"를 키워드로 사용하는 것을 보여줄건데, 다른걸로 하고 싶으면 맘대로 해라.
            -  oauth token, 이 앱을 사용하는 Twitter 계정을 증명하는
            - oauth token secret, Twitter 계정의 비밀번호로써 제공
          • "https://apps.twitter.com/" 에 가서 트위터 계정을 셋팅하고 consumer key과 secret 를 생성하세요.
            여러분의 access token 과 secret도 마찬가지로.
          • 혹시 이런 키들을 생성하는 방법이 확실하지 않다면,
            Twitter input 플러그인(https://www.elastic.co/guide/en/logstash/5.4/plugins-inputs-twitter.html)에 문서를 보세요.
          • 앞서서 작업했었을때와 마찬가지로  config file을 만들어봅시다.
            (이름은 second-pipeline.conf) configuration 파이프라인의 골격을 포함하죠.
            만약 원한다면, 이전에 사용했던것을 재 사용할수 있지만, 여러분이 Logstash을 운영할때, 정확한 config 파일이름을 잘 전달하세요
          • second-pipeline.conf 파일에 input 섹션을을 추가하세요.
            아래에서 보이는 placeholder 값에 대한 여러분의 값을 추가하세요.

                twitter {
                    consumer_key => "enter_your_consumer_key_here"
                    consumer_secret => "enter_your_secret_here"
                    keywords => ["cloud"]
                    oauth_token => "enter_your_access_token_here"
                    oauth_token_secret => "enter_your_access_token_secret_here"
                }
            


        • Configuring Filebeat to Send Log Lines to Logstach
          • filebeat.yml 파일을 수정합니다.

            filebeat.prospectors:
            - input_type: log
              paths:
                - /var/log/*.log 
              fields:
                type: syslog 
            output.logstash:
              hosts: ["localhost:5043"]
            

          • 저장하고, 실제 시나리오상에서 구현해야 할 TLS/SSL 세팅은 명시하지 않는것이 구성을 쉽게하는 방법이다.

        • Writing Logstash Data to a File

          • file output 플러그인을 사용해서 직접 데이터를 파일에 작성하도록 Logstash pipleline을 설정할수 있습니다.

              file {
                    path => "/path/to/target/file"
                }
            


        • Writing to MultiElasticsearch Nodes

          • 다중 Elasticseach 노드에 작성하는 것은, 주어진 Elasticsearch 노드에 대한 리소스 요구가 줄어들 뿐아니라 
            특정 노드를 사용할수 없을때  클러스터안에 중복 입력 지점을 제공 할수 있습니다.
          • Elasticsearch 노드들은,  읽기 위해 second-pipeline.conf 파일의 output 섹션을 수정합니다. 

            output {
                elasticsearch {
                    hosts => ["IP Address 1:port1", "IP Address 2:port2", "IP Address 3"]
                }
            }
            


          • host라인에 Elasticsearch 클러스에 3개의 non-master 노드의 IP 주소를 사용합니다.
            hosts 파라미터는 다수의 IP 주소들을 리스트 할때, Logstash은 주소리스트를 통한 요청들을 로드밸런싱합니다.
            또한 알아둬야 할것은 Elasticsearch의 기본포트는 9200 이고, 위의 configuration에서 생략할수도 있습니다.

        • Testing the Pipeline

          • 전체적으로 정리하면 아래와 같습니다.

            input {
                twitter {
                    consumer_key => "enter_your_consumer_key_here"
                    consumer_secret => "enter_your_secret_here"
                    keywords => ["cloud"]
                    oauth_token => "enter_your_access_token_here"
                    oauth_token_secret => "enter_your_access_token_secret_here"
                }
                beats {
                    port => "5043"
                }
            }
            output {
                elasticsearch {
                    hosts => ["IP Address 1:port1", "IP Address 2:port2", "IP Address 3"]
                }
                file {
                    path => "/path/to/target/file"
                }
            }
            


          • Logstash는 여러분이 설정한 Twitter 피드부터 데이터를 소비하고 있고, Filebeat로 부터 데이터를 받고 있고,
            파일에 작성하는것과 동시에 ,Elasticsearch 클러스터에 3개의 노드들에게 이 정보를 인덱싱하고 있습니다. 

          • 데이터 소스 머신에서, 아래 명령으로 Filebeat를 실행합니다.

            sudo ./filebeat -e -c filebeat.yml -d "publish"
            


          • Filebeat 는 5034포트에 연결을 시도 할겁니다.
            active Beats 플러그인과 함께 Logstash가 사직할떄까지, 해당 포토에 어떠한 대답이 있지 않을것입니다.
            그래서 여러분이 볼수 있는 해당 포트에 연결에 실패되었다라는 여겨지는 메시지들이 현재는 정상입니다.
          • 검증을 위해서는 아래 명령어를 통해서 진행합니다.

            bin/logstash -f second-pipeline.conf --config.test_and_exit
            


          • 위에 대한 내용에 대해서 통과하면, Logstash를 아래와 같은 명령으로 실행합니다.

            bin/logstash -f second-pipeline.conf
            


          • 정보가 존재하는 것을 검증하기 위한 타겟파일을 찾기 위한 grep 유틸리티를 사용합니다.

            grep syslog /path/to/target/file
            


          • Elasticsearch 클러스트에서 같은 정보를 찾기 위해서 아래와 같이 쿼리를 해봅니다.

            curl -XGET 'localhost:9200/logstash-$DATE/_search?pretty&q=fields.type:syslog'
            


          • $DATE는 현재 날짜 YYYY.MM.DD 포멧으로 변경해야 합니다.
            트위터 피드를 보기 위해서는 아래와 같은 요청을 시도 합니다.

            curl -XGET 'http://localhost:9200/logstash-$DATE/_search?pretty&q=client:iphone'
          • Twitter Client Error 가 발생하네요.. 두가지인데, 하나는 NoMethodError ,
            그리고 나머지 하나는 인코딩 문제인듯 싶은데 UndefinedConversionError 입니다.
            트위터 연동을 안하고 말죠... 나머지는 잘 됩니다.