'logstash'에 해당되는 글 38건

  1. 2017.07.19 [Logstash] input file plugin 에 대해서 알아 봅니다.
  2. 2017.01.24 [검색추천] Apache mahout + Elastic Stack 을 이용한 기본 추천
  3. 2017.01.12 [Logstash] 간헐적으로 logstash 가 죽습니다.
  4. 2016.08.16 [Logstash] Exception 에러로그 detection.
  5. 2016.05.18 [Logstash] input-http, filter-mutate,grok 샘플 config
  6. 2016.04.20 [Logstash] logstash slack chat output plugin 만들기
  7. 2016.04.14 [Logstash] Kafka 연동 시 Producer에서 등록이 잘 안될 때 확인 사항 -1
  8. 2016.04.14 [Logstash] Kafka 연동 시 쉽게 디버깅 하기.
  9. 2016.02.12 [Logstash] Dynamic Config Reloading
  10. 2015.11.27 [Logstash] grok pattern test site.

[Logstash] input file plugin 에 대해서 알아 봅니다.

Elastic/Logstash 2017. 7. 19. 13:25

가장 많이 사용하고 있는 logstash input plugin 중에 하나라고 생각 합니다.

저 역시 현업에서 제일 많이 사용하고 있는 plugin 이기도 합니다.


elastic reference 문서를 보시면 설명이 잘 나와 있습니다.

하지만 신뢰 할 수 없는 기억력으로 인해서 한번 작성해 봅니다.


이미 많은 분들이 input file plugin 에 대해서 많은 자료들을 공유해 주셨기 때문에 구글링 몇 번 해보시면 좋은 정보를 얻으실 수 있습니다.


참고문서)
https://www.elastic.co/guide/en/logstash/current/plugins-inputs-file.html


logstash input file 기본 동작은 ruby-filewatch를 이용한 tail 입니다. 


주요 설정 정보)

1. start_position

이 설정은 logstash 실행 시 읽기 작업에 대한 수행 정보를 정의 합니다.

beginning 과 end 설정은 2번 sincedb 파일이 있고 없고에 따라 동작이 다르다고 생각 하시면 됩니다.

즉, sincedb 에 offset 정보가 있으면 해당 offset 부터 읽게 되고 없으면 beginning, end 설정 동작 방식으로 동작 합니다.

beginning 은 처음(이전) 부터 읽어 들이고, end 는 가장 최근 부터 읽어 들이게 됩니다.


결국, 데이터의 유실 없이 데이터를 읽기 위해서는 beginning 으로 설정 하셔야 합니다.

default value 는 end 입니다.


2. sincedb

이건 설정은 아니고 sincedb 파일에 대한 내용입니다.

logstash input file 을 사용하게 되면 sincedb 파일에 어디까지 읽었는지 정보를 기록하게 됩니다.

reference 문서를 보시면 sincedb 에 기록하는 정보에 대해서 설명이 자세히 나와 있습니다.


Sincedb files are text files with four columns:


The inode number (or equivalent).

The major device number of the file system (or equivalent).

The minor device number of the file system (or equivalent).

The current byte offset within the file.


$ cat .sincedb_8d6238d5255f464e564ecdb307fe0c0c

7341423 0 51713 67247655


sincedb_path 를 설정 하지 않을 셨을 경우는 user home directory 를 확인해 보시거나,

~/logstash-5.5.0/data/plugins/inputs/file/ 을 확인해 보시면 됩니다.


#pick SINCEDB_DIR if available, otherwise use HOME

sincedb_dir = ENV["SINCEDB_DIR"] || ENV["HOME"]

※ .sincedb 작성 시 overwrite 인지 append 인지 확인 후 공유 드리겠습니다. ㅡ.ㅡ;

미쳐 확인을 못했내요.

->

input file 을 여러개 등록 하면 sincedb 가 여러개 생성이 됩니다.

참고 파일은 filewatch 소스코드를 보시면 되시겠습니다.

($ ~elastic/logstash-5.5.0/vendor/bundle/jruby/1.9/gems/filewatch-0.9.0/lib/filewatch)


input file 을 여러개 등록 하면 sincedb 에 inode 가 다른게 여러게 생성 됩니다.

즉, overwrite(update) 이라고 보시면 되겠습니다.

위에 잘못 설명한 부분은 확인 없이 그냥 동작 하고 있는 것만 가지고 작성을 하다 보니 놓친 부분 입니다. 죄송합니다.

기존에 logstash 가 처리 하고 있는 log file 자체의 변경이 발생 하였을 경우 기 생성된 sincedb 에 row가 추가 되면서 변경된 log file 의 inode 값과 offset 정보가 추가 되게 됩니다.

- 파일이 삭제 된 후 다시 생성 된 경우가 대표적인 예가 되겠습니다.


189699226 -rw-r--r--  1 henry  staff  105  7 20 15:03 file.log

$ rm -f file.log

189766986 -rw-r--r--  1 henry  staff  120  7 20 15:04 file.log


$ cat .sincedb_27eb92c828fb885f9741fac9e538c0e1

189699226 1 4 285

189766986 1 4 150


3. sincedb_write_interval

이 설정은 logstash 가 열심히 일을 하고 어디까지 일을 했는지 주기적으로 기록하도록 하는 주기를 작성 하게 됩니다.

설정 주기가 너무 길게 되면 logstash가 비정상 종료 후 재 실행 되었을 때 데이터가 중복으로 입력 될 수도 있으니 적절한 주기를 찾아서 설정 하는게 중요 합니다.


현재 inode 파일의 읽어 들인 offset 정보를 sincedb 에 기록 하게 됩니다.

default value 는 15초로 되어 있습니다.


4. stat_interval

이 설정은 logstash 가 읽어야 하는 로그 파일에 새로운 로그가 추가 되었는지 확인하기 위한 주기를 설정 하게 됩니다.

reference 문서에서는 아래와 같이 설명 하고 있습니다.

How often (in seconds) we stat files to see if they have been modified. Increasing this interval will decrease the number of system calls we make, but increase the time to detect new log lines.


system call 을 줄일 것인지 빠르게 신규 로그 감지 할 것인지 결정을 하셔야 합니다.

default value 는 1초 입니다.


5. discover_interval

이 설정은 filename pattern 을 이용해서 신규 로그 파일이 추가 되었는지 확인 하기 위한 주기를 설정 하게 됩니다.

 default value 는 15초 입니다.


여기까지 알아 두면 좋은 설정들은 이렇습니다.

이를 기반으로 샘플 설정을 작성해 보면 아래와 같습니다.


input {

  file {

    path => "/XXXX/logs/test-file.log"

    start_position => "beginning"

  }

}


결국 기본 설정으로 돌려도 크게 무리는 없습니다.

다만, 생성되는 로그 파일의 크기와 worker, queue 설정 크기에 따라 값들을 최적화 하시면 됩니다.

왜냐면 사용하시는 환경 마다 다 다르기 때문이고, 환경에 맞춰서 튜닝을 할 수 밖에 없기 때문 입니다.


3, 4, 5 번에 대한 테스트는

3번은 설정 변경 하시면서 sincedb 값이 바뀌는 걸 보시면 됩니다.

4번은 설정 변경 하시면서 output  으로 언제 전달 되는지 보시면 됩니다.

5번은 설정 변경 하시면서 log file을 rotate 해보시면 됩니다.


여기서는 그냥 4번 초간단 테스트 예제만 보여 드리겠습니다.


1. log file 을 생성하고 해당 파일에 log를 기록 합니다.

while true;
do

DATE=$(date '+%Y%m%d%H%M%S');

echo $DATE >> /XXXX/logs/test-file.log;

cat test-file.log;

sleep 2;

done

코드 보셔서 아시겠지만 2초 마다 datetime  을 file.log 에 기록하는 스크립트 입니다.


2. logstash 를 실행 시킵니다.

[file.config]

input {

  file {

    path => "/XXXX/logs/test-file.log"

    start_position => "beginning"

    stat_interval => 30

  }

}


output {

  stdout {

    codec => "rubydebug"

  }

}


$ bin/logstash -f ./config/file.conf --config.reload.automatic


이렇게 하시면 30초 마다 file.log 에 기록된 정보를 읽어 오게 됩니다.

참 쉽죠잉.


여기까지 logstash input file 에 대한 설명이였는데요.

도움이 되셨다면 좋겠습니다.


:

[검색추천] Apache mahout + Elastic Stack 을 이용한 기본 추천

Elastic/Elasticsearch 2017. 1. 24. 11:47

Elastic Stack 과 Apache mahout 을 이용한 추천 데이터 생성을 다뤄 볼까 합니다.

기본적으로는 Elastic Stack 만 가지고도 cohort 분석을 통해 추천 데이터 마트 구성이 가능 한데요.

추천 데이터에 대한 품질을 좀 더 좋게 하기 위해 Apache mahout 을 활용해 보도록 하겠습니다.


여기서 다루는 내용은 누구나 쉽게 접근 할 수 있도록 Hello World! 수준만 기술 합니다.


[Elastic Stack]

https://www.elastic.co/products


[Apache mahout]

https://mahout.apache.org/


위 두 솔루션은 모두 오픈소스 이며 예제 코드가 해당 소스에 잘 만들어져 있어 누구나 쉽게 활용이 가능합니다.


Step 1)

Elasticsearch + Logstash + Kibana 를 이용해 로그를 수집하고 추천 할 raw data 를 생성 합니다.


User item click log -> Logstash collect -> Elasticsearch store -> Kibana visualize -> CSV download


여기서 수집한 데이터 중 추출 데이터는 user id + item id + click count 입니다.

아래는 Kibana QueryDSL 예제 입니다.

{

  "size": 0,

  "query": {

    "filtered": {

      "query": {

        "query_string": {

          "query": "cp:CLK AND id:[0 TO *]",

          "analyze_wildcard": true

        }

      },

      "filter": {

        "bool": {

          "must": [

            {

              "range": {

                "time": {

                  "gte": 1485010800000,

                  "lte": 1485097199999,

                  "format": "epoch_millis"

                }

              }

            }

          ],

          "must_not": []

        }

      }

    }

  },

  "aggs": {

    "2": {

      "terms": {

        "field": "user_id",

        "size": 30000,

        "order": {

          "_count": "desc"

        }

      },

      "aggs": {

        "3": {

          "terms": {

            "field": "item_id",

            "size": 10,

            "order": {

              "_count": "desc"

            }

          }

        }

      }

    }

  }

}


Step 2)

Apache mahout 에서 사용할 recommender 는 UserBasedRecommender 입니다.

샘플 코드에도 나와 있지만 dataset.csv 파일은 아래와 같은 형식 입니다.

- Creating a User-Based Recommender in 5 minutes


1,10,1.0
1,11,2.0
1,12,5.0
1,13,5.0

형식) userId,itemId,ratingValue


Step1 에서 위와 같은 형식을 맞추기 위해 user_id, item_id, click_count 를 생성 하였습니다.

이 데이터를 기반으로 UserBasedRecommender 를 돌려 보도록 하겠습니다.


Step 3)

아래 보시면 샘플 코드가 잘 나와 있습니다.

https://github.com/apache/mahout/tree/master/examples/src/main/java/org/apache/mahout


Main class 하나 만드셔서 Step2 에 나와 있는 코드로 돌려 보시면 됩니다.

저는 UserBasedRecommender 를 implements 해서 별도로 구현했습니다.

이건 누구나 쉽게 하실 수 있는 부분이기 때문에 examples 에 나와 있는 BookCrossingRecommender 클래스등을 참고 하시면 됩니다.


UserBasedRecommenderRunner runner = new UserBasedRecommenderRunner();

Recommender recommender = runner.buildRecommender();


// 710039번 유저에 대한 추천 아이템 3개

List<RecommendedItem> recommendations = recommender.recommend(710039, 3);


for (RecommendedItem recommendation : recommendations) {

    LOG.debug("추천 아이템 : {}", recommendation);

}


[실행 로그]

11:39:31.527 [main] INFO  o.a.m.c.t.i.model.file.FileDataModel - Creating FileDataModel for file /git/prototype/data/user-to-item.csv

11:39:31.626 [main] INFO  o.a.m.c.t.i.model.file.FileDataModel - Reading file info...

11:39:31.765 [main] INFO  o.a.m.c.t.i.model.file.FileDataModel - Read lines: 63675

11:39:31.896 [main] INFO  o.a.m.c.t.i.model.GenericDataModel - Processed 10000 users

11:39:31.911 [main] INFO  o.a.m.c.t.i.model.GenericDataModel - Processed 19124 users

11:39:31.949 [main] DEBUG o.a.m.c.t.i.r.GenericUserBasedRecommender - Recommending items for user ID '710039'

11:39:31.965 [main] DEBUG o.a.m.c.t.i.r.GenericUserBasedRecommender - Recommendations are: [RecommendedItem[item:35222, value:4.0], RecommendedItem[item:12260, value:4.0], RecommendedItem[item:12223, value:1.5]]

11:39:31.966 [main] DEBUG o.h.p.mahout.meme.MemeProductRunner - 추천 아이템 : RecommendedItem[item:35222, value:4.0]

11:39:31.966 [main] DEBUG o.h.p.mahout.meme.MemeProductRunner - 추천 아이템 : RecommendedItem[item:12260, value:4.0]

11:39:31.967 [main] DEBUG o.h.p.mahout.meme.MemeProductRunner - 추천 아이템 : RecommendedItem[item:12223, value:1.5]


[Recommender]

similarity = new PearsonCorrelationSimilarity(dataModel);


// 이웃한 N명의 사용자 데이터로 추천 데이터 생성

// UserNeighborhood neighborhood = new NearestNUserNeighborhood(2, similarity, dataModel, 0.2);


// 특정 값이나 임계치를 넘는 모든 사용자의 데이터로 추천 데이터 생성, samplingrate : user sampling rate 10%

// UserNeighborhood neighborhood = new ThresholdUserNeighborhood(0.1, similarity, dataModel, 0.1);


UserNeighborhood neighborhood = new ThresholdUserNeighborhood(0.2, similarity, dataModel, 1.0);

recommender = new GenericUserBasedRecommender(dataModel, neighborhood, similarity);


- 데이터 크기가 너무 작아 ThresholdUserNeighborhood 를 이용하였습니다.


이와 같이 검색 클릭 로그를 기반으로 CF를 돌려 추천 데이터를 만드는 아주 간단한 방법을 알아봤습니다.

만든 추천 데이터에 대한 평가도 가능 합니다.

역시 examples 에 xxxxxxEvaluator 클래스들을 참고하셔서 구현해 보시면 됩니다.


:

[Logstash] 간헐적으로 logstash 가 죽습니다.

Elastic/Logstash 2017. 1. 12. 11:35

aws 에 ec2 인스턴스를 이용해서 logstash 를 다양한 용도로 활용하고 있습니다.

그렇다 보니 시스템 자원을 최대한 뽑아서 사용을 하고 있어서 간헐적으로 logstash 가 죽는 문제가 발생을 했었습니다.


하나의 인스턴스에 logstash daemon 을 4개 띄워서 사용중에 있습니다.

그 이외 elasticsearch, kibana 등도 함께 띄워서 사용을 하고 있구요.


모든 데몬이 실행중일 경우 시스템 memory 자원은 1GB 정도 남게 되며 7GB 정도를 사용하게 됩니다.

처음 부터 7GB를 잡고 실행 되지는 않지만 JVM 특성상 full gc 돌기 전에는 조금씩 증가 하다 7GB 까지 도달하게 되고 좀 다양한 상황에 맞춰 700MB 이하로 까지 free memory 가 남기도 합니다.


반드시 free memory 가 1GB 미만 이면 죽는 것은 아니지만 죽을 확율이 높아 지는 것으로 보입니다.

실제 운영을 하고 분석을 해보니 그렇습니다.


혹시 운영 하시는 분들은 참고하시라고 글 올려 봤습니다.


[참고문서]

https://www.elastic.co/guide/en/logstash/2.4/performance-troubleshooting.html


[발췌문구]

Leave at least 1GB free for the OS and other processes.


:

[Logstash] Exception 에러로그 detection.

Elastic/Logstash 2016. 8. 16. 12:35

바빠서 초간단 버전 업데이트 합니다.


1. patterns 생성)

잘 아시겠지만 grok filter 에서의 pattern 은 deprecated 되었습니다. 그래서 patterns_dir 을 만들어서 설정을 하셔야 합니다.

저는 그냥 기존에 생성된 LOGLEVEL 패턴에 (Ee)xception 만 추가 했습니다.


patterns/patterns

LOGLEVEL ([Ee]xception|EXCEPTION|[Aa]lert|ALERT|[Tt]race|TRACE|[Dd]ebug|DEBUG|[Nn]otice|NOTICE|[Ii]nfo|INFO|[Ww]arn?(?:ing)?|WARN?(?:ING)?|[Ee]rr?(?:or)?|ERR?(?:OR)?|[Cc]rit?(?:ical)?|CRIT?(?:ICAL)?|[Ff]atal|FATAL|[Ss]evere|SEVERE|EMERG(?:ENCY)?|[Ee]merg(?:ency)?)


[참고]

https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns


2. config 생성)

input {

  file {

    path => "/server/elastic/elasticsearch-2.3.5/logs/*.log"

  }

}


filter {

  grok {

    patterns_dir => ["./patterns"]

    match => {

      "message" => "%{LOGLEVEL:error_log}"

    }

  }


  if "_grokparsefailure" in [tags] {

    drop { }

  }

}


output {

  if [error_log] in ["Exception","exception"] {

    stdout {

      codec => "rubydebug"

    }

  }

}


이 설정의 용도는 elasticsearch 에서 발생하는 exception 을 감지 하기 위한 것입니다.

초간단 버전이니 튜닝은 각자 잘 하시면 됩니다.



※ 실제 이것만 가지고 서비스에 적용하시면 문제 발생 할 수 있습니다.

filebeats 와 연동해서 사용하시길 권장 드립니다.

:

[Logstash] input-http, filter-mutate,grok 샘플 config

Elastic/Logstash 2016. 5. 18. 17:48

그냥 올려봅니다.


[logstash config]

input {

  http {

    codec => json {

    }

  }

}


filter {

  mutate {

    add_filed => { "request_uri" => "%{headers[request_uri]}" }

    replace => { "message" => "input http 사용 시 headers 내부 변수 접근(nested variables)" }

  }


  grok {

    match => { "request_uri" => "%{URIPARAM:request}" }

  }

}


output {

  stdout { codec => rubydebug }

}


뭐 정말 별거 아닌고 모니터링 시스템 설계 하다가 prototype 구현을 해봐야 겠다 싶어서 대충 돌려보다 grok 에러가 발생해서 기록해 본겁니다.


[logstash http input 사용 시 출력 결과]

{

       "message" => "",

      "@version" => "1",

    "@timestamp" => "2016-05-18T07:19:36.140Z",

          "host" => "127.0.0.1",

       "headers" => {

         "request_method" => "GET",

           "request_path" => "/",

            "request_uri" => "/?message=test",

  1 input {

           "http_version" => "HTTP/1.1",

              "http_host" => "127.0.0.1:8080",

        "http_user_agent" => "curl/7.43.0",

            "http_accept" => "*/*"

    },

          "tags" => [

        [0] "_grokparsefailure"

    ]

}


:

[Logstash] logstash slack chat output plugin 만들기

Elastic/Logstash 2016. 4. 20. 14:11

필요해서 prototype 수준으로 만들어 봤습니다.

추후 input 와 filter 부분에서 필요한 로직을 각자 구현 하시면 될 것 같습니다.


참고문서)

https://api.slack.com/docs/oauth-test-tokens

https://api.slack.com/methods

https://github.com/logstash-plugins/logstash-output-example.git

http://www.rubydoc.info/github/cheald/manticore/Manticore/Client


구현소스)

https://github.com/HowookJeong/logstash-output-slack_chat


실행방법)

    $ bin/logstash -e '
        input {
            stdin{}
        }

        output {
            slack_chat {
                url => "http://slack.com/api/chat.postMessage"
                token => "YOUR_TOKEN_STRING"
                channel => "SLACK_CHANNEL_ID"
            }

            stdout { codec => rubydebug }
        }
    '

아주 간단하죠.

뭐 꼭 logstash plugin 이 아니더라도 일반 httpclient 라이브러리를 이용해서 다양한 방법으로 구현 가능하니 목적에 맞게 구현해서 사용하시면 될 것 같습니다.


Other logstash slack)

https://github.com/cyli/logstash-output-slack

:

[Logstash] Kafka 연동 시 Producer에서 등록이 잘 안될 때 확인 사항 -1

Elastic/Logstash 2016. 4. 14. 12:35

한 줄 정리)

문제는 Kafka version 과 logstash kafka plugin version 이 맞지 않아서 발생한 문제 입니다.

ㅡ.ㅡ;



-----------------------------------------------------------------


다 똑같지는 않겠지만 간혹 kafka + zk 실행 하고 producer 실행 및 consumer 실행을 했는데 데이터가 들어 가지도 않고 가져 오지도 못하는 문제를 겪는 경우가 있습니다.


일단 제가 경험한 메시지는 아래와 같습니다.


ERROR Error when sending message to topic test1 with key: null, value: 13 bytes with error: Batch Expired


이 메시지를 검색해 보면 그닥 쓸만한 내용이 나오지 않습니다.

그래서 검색어를 "kafka advertised host name"로 변경해서 찾아 보았습니다.


ec2에 올려 구성한 경우 위 검색어에 대한 문제로 kafka 와 zk 가 정상적으로 등록이 되지 않는 문제가 있는 것 같습니다.

실제 zk cli 로 들어가서 ls /brokers/ids/0 하면 아무런 정보가 나오지 않습니다. 

이것은 zk에 broker 가 정상적으로 등록이 되지 않았다는 의미 인데요.


https://cwiki.apache.org/confluence/display/KAFKA/FAQ


여기서 아래 내용 참고해서 설정 변경 하시고 broker가 zk 에 잘 등록되어 있는지 부터 확인 하시면 좋을 것 같습니다.


Why can't my consumers/producers connect to the brokers?

When a broker starts up, it registers its ip/port in ZK. You need to make sure the registered ip is consistent with what's listed in metadata.broker.list in the producer config. By default, the registered ip is given by InetAddress.getLocalHost.getHostAddress. Typically, this should return the real ip of the host. However, sometimes (e.g., in EC2), the returned ip is an internal one and can't be connected to from outside. The solution is to explicitly set the host ip to be registered in ZK by setting the "hostname" property in server.properties. In another rare case where the binding host/port is different from the host/port for client connection, you can set advertised.host.name and advertised.port for client connection.


:

[Logstash] Kafka 연동 시 쉽게 디버깅 하기.

Elastic/Logstash 2016. 4. 14. 11:26

그냥 들어가고 나오고가 잘되는지 보기 위한 logstash input/output config 입니다.

별것도 아니지만 늘 구글링 하기도 귀찮고 해서 기록해 봅니다.


참고문서)

https://www.elastic.co/blog/logstash-kafka-intro

https://www.elastic.co/guide/en/logstash/current/plugins-outputs-kafka.html

https://www.elastic.co/guide/en/logstash/current/plugins-inputs-kafka.html



Logstash Output Kafka - Producer)


$ bin/logstash -e "input { stdin {} } output { kafka { bootstrap_servers => '172.x.x.x:9024' topic_id => 'logstash_logs' } }"



Logstash Input Kafka - Consumer)


$ bin/logstash -e "input { kafka { zk_connect => '172.x.x.x:2181' topic_id => 'logstash_logs' } } output { stdout { codec => rubydebug } }"


:

[Logstash] Dynamic Config Reloading

Elastic/Logstash 2016. 2. 12. 10:57

예전에도 있던 기능 이였는지는 잘 모르겠습니다.

그래서 기록해 봅니다.


원문링크)


한 줄 요약)

--auto-reload --reload-interval 옵션을 통해 logstash 재시작 없이 설정 적용이 가능 합니다.


명령어 예시)

bin/logstash -f config_file --auto-reload --reload-interval 2

※ 원문에 나와 있는 예시 입니다.

※ 기본 reload interval 은 3초로 정의 되어 있습니다.


이 기능을 제공하는 Version은 logstash 2.2 이상 입니다.

:

[Logstash] grok pattern test site.

Elastic/Logstash 2015. 11. 27. 11:38

logstash grok 디버그용 웹사이트 입니다.

누군가 알려주셔서 일단 기록해 봅니다.


[Grok Debugger]


[Test grok pattern]


: