728x90
반응형

 

이전글에서 ELS Stack 구성하기 위해 설치를 진행했습니다.

 

이번 글에서는 Logstash의 설정을 알아보겠습니다.

 

gigas-blog.tistory.com/255

[Server] MacOS X ELK Stack 구성하기 #1 설치

어플리케이션이 구동 중 발생하는 Exception을 모니터링할 수 있는 시스템을 위해 ELK Stack 환경을 구성하려고 합니다. ELS (ElK Stack) 구성 Java 8 Elasticsearch 7.1 Logstash 7.1 Kibana 7.1 Mac OS X에 ELK..

gigas-blog.tistory.com

 

 

 

우선 services로 등록된 목록을 조회합니다.

brew services list

 

 

 

logstash의 상태가 error로 나와있는데

Name          Status  User  Plist
elasticsearch started gigas /Users/gigas/Library/LaunchAgents/homebrew.mxcl.elasticsearch.plist
kibana        started gigas /Users/gigas/Library/LaunchAgents/homebrew.mxcl.kibana.plist
logstash      error   gigas /Users/gigas/Library/LaunchAgents/homebrew.mxcl.logstash.plist

 

 

 

logstash.log 파일을 보면 왜 error 가 발생하는지 확인이 가능합니다.

/usr/local/var/log/logstash.log

 

 

 

내용을 보면 pipeline.yml 설정파일이 비어있다고 나오는군요.

ERROR: Pipelines YAML file is empty. Location: /usr/local/Cellar/logstash/7.12.0/libexec/config/pipelines.yml
usage:
  bin/logstash -f CONFIG_PATH [-t] [-r] [] [-w COUNT] [-l LOG]
  bin/logstash --modules MODULE_NAME [-M "MODULE_NAME.var.PLUGIN_TYPE.PLUGIN_NAME.VARIABLE_NAME=VALUE"] [-t] [-w COUNT] [-l LOG]
  bin/logstash -e CONFIG_STR [-t] [--log.level fatal|error|warn|info|debug|trace] [-w COUNT] [-l LOG]
  bin/logstash -i SHELL [--log.level fatal|error|warn|info|debug|trace]
  bin/logstash -V [--log.level fatal|error|warn|info|debug|trace]
  bin/logstash --help
[2021-04-15T14:35:20,917][FATAL][org.logstash.Logstash    ] Logstash stopped processing because of an error: (SystemExit) exit

 

 

 

pipelines 파일을 열어보겠습니다.

oepn /usr/local/etc/logstash/pipelines.yml
or
vi /usr/local/etc/logstash/pipelines.yml

* deb 또는 rpm으로 설치를 진행하면 /etc/logstash/conf.d 디렉토리에 구성파일이 배치 됩니다. *

 

하지만 위와 같이 설치 하지 않았기에 이전글을 따라 설치하셨다면 /usr/local/etc/logstash 경로에 배치 됩니다.

 

공식문서는 아래와 같습니다.

www.elastic.co/guide/en/logstash/7.x/dir-layout.html

Logstash Directory Layout | Logstash Reference [7.x] | Elastic

Logstash Docker containers do not create log files by default. They log to standard output.

www.elastic.co

 

 

 

많은 라인의 설정 내용이 있지만 모두 주석처리가 되어있습니다.

 

주석을 제거하여 pipeline.id와 path.config를 수정하였습니다. 

 

syslog.conf 는 조금 더 아래부분에서 새로 만들겠습니다.

# - pipeline.id: test
- pipeline.id: sample

#   path.config: "/tmp/logstash/*.config"
path.config: "/usr/local/etc/logstash/syslog.conf"

 

 

 

/usr/local/etc/logstash/ 경로에는 pipeline.yml 뿐만아니라 아래처럼 몇가지 파일들이 기본으로 있습니다.

 

logstash를 실행하려면 conf 파일이 필요한데 기본적으로 logstash-sample.conf 설정파일이 샘플로 들어있습니다.

jvm.options
log4j2.properties
logstash-sample.conf
logstash.yml
pipelines.yml
startup.options
/usr/local/etc/logstash/logstash-sample.conf

 

 

 

샘플 conf 파일은 아래와 같이 구성되어있습니다.

# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.

input {
  beats {
    port => 5044
  }
}

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
    #user => "elastic"
    #password => "changeme"
  }
}

 

 

 

기존파일도 사용가능하고 새로운 파일을 만들어서 연결도 가능합니다.

 

syslog.conf 파일을 만들어 보겠습니다.

vi /usr/local/etc/logstash/syslog.conf

 

 

 

MacOS X의 로그를 보여줄 수 있도록 file을 읽는 설정과 filter 설정으로 message를 만들었습니다.

input {
  file {
    path => [ "/var/log/*.log", "/var/log/messages", "/var/log/syslog" ]
    type => "syslog"
  }
}

filter {
  if [type] == "syslog" {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{host}" ]
    }
    syslog_pri { }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
  }
}

output {
  elasticsearch {
    hosts => ["127.0.0.1:9200"] 
    index => "syslog-demo"
  }
  stdout { codec => rubydebug }
}

 

 

 

새로 생성한 syslog.conf 파일의 구성을 로드 합니다.

 

별도 설정파일없이 -f 옵션으로 시작하고 있기 때문에 brew services 로 등록되지는 않습니다.

/usr/local/bin/logstash -f syslog.conf 
Using JAVA_HOME defined java: /Library/Java/JavaVirtualMachines/jdk-10.0.2.jdk/Contents/Home
Java HotSpot(TM) 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
Sending Logstash logs to /usr/local/Cellar/logstash/7.12.0/libexec/logs which is now configured via log4j2.properties
[2021-04-15T12:21:23,862][INFO ][logstash.runner          ] Log4j configuration path used is: /usr/local/Cellar/logstash/7.12.0/libexec/config/log4j2.properties
[2021-04-15T12:21:23,874][INFO ][logstash.runner          ] Starting Logstash {"logstash.version"=>"7.12.0", "jruby.version"=>"jruby 9.2.13.0 (2.5.7) 2020-08-03 9a89c94bcc Java HotSpot(TM) 64-Bit Server VM 10.0.2+13 on 10.0.2+13 +indy +jit [darwin-x86_64]"}
[2021-04-15T12:21:24,004][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
[2021-04-15T12:21:24,036][INFO ][logstash.agent           ] No persistent UUID file found. Generating new UUID {:uuid=>"31d249d3-662b-4761-a658-482e72562d5c", :path=>"/usr/local/Cellar/logstash/7.12.0/libexec/data/uuid"}
[2021-04-15T12:21:24,642][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}
[2021-04-15T12:21:25,664][INFO ][org.reflections.Reflections] Reflections took 38 ms to scan 1 urls, producing 23 keys and 47 values 
[2021-04-15T12:21:26,763][INFO ][logstash.outputs.elasticsearch][main] Elasticsearch pool URLs updated {:changes=>{:removed=>[], :added=>[http://127.0.0.1:9200/]}}
[2021-04-15T12:21:26,924][WARN ][logstash.outputs.elasticsearch][main] Restored connection to ES instance {:url=>"http://127.0.0.1:9200/"}
[2021-04-15T12:21:27,123][INFO ][logstash.outputs.elasticsearch][main] ES Output version determined {:es_version=>7}
[2021-04-15T12:21:27,126][WARN ][logstash.outputs.elasticsearch][main] Detected a 6.x and above cluster: the `type` event field won't be used to determine the document _type {:es_version=>7}
[2021-04-15T12:21:27,137][INFO ][logstash.outputs.elasticsearch][main] New Elasticsearch output {:class=>"LogStash::Outputs::ElasticSearch", :hosts=>["//127.0.0.1:9200"]}
[2021-04-15T12:21:27,202][INFO ][logstash.outputs.elasticsearch][main] Using a default mapping template {:es_version=>7, :ecs_compatibility=>:disabled}
[2021-04-15T12:21:27,262][INFO ][logstash.outputs.elasticsearch][main] Index Lifecycle Management is set to 'auto', but will be disabled - Index Lifecycle management is not installed on your Elasticsearch cluster
[2021-04-15T12:21:27,263][INFO ][logstash.outputs.elasticsearch][main] Attempting to install template {:manage_template=>{"index_patterns"=>"logstash-*", "version"=>60001, "settings"=>{"index.refresh_interval"=>"5s", "number_of_shards"=>1}, "mappings"=>{"dynamic_templates"=>[{"message_field"=>{"path_match"=>"message", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false}}}, {"string_fields"=>{"match"=>"*", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false, "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}}}}], "properties"=>{"@timestamp"=>{"type"=>"date"}, "@version"=>{"type"=>"keyword"}, "geoip"=>{"dynamic"=>true, "properties"=>{"ip"=>{"type"=>"ip"}, "location"=>{"type"=>"geo_point"}, "latitude"=>{"type"=>"half_float"}, "longitude"=>{"type"=>"half_float"}}}}}}}
[2021-04-15T12:21:27,293][INFO ][logstash.outputs.elasticsearch][main] Installing elasticsearch template to _template/logstash
[2021-04-15T12:21:27,362][INFO ][logstash.javapipeline    ][main] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>12, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50, "pipeline.max_inflight"=>1500, "pipeline.sources"=>["/usr/local/etc/logstash/syslog.conf"], :thread=>"#<Thread:0x39654f6f run>"}
[2021-04-15T12:21:28,430][INFO ][logstash.javapipeline    ][main] Pipeline Java execution initialization time {"seconds"=>1.07}
[2021-04-15T12:21:28,709][INFO ][logstash.inputs.file     ][main] No sincedb_path set, generating one based on the "path" setting {:sincedb_path=>"/usr/local/Cellar/logstash/7.12.0/libexec/data/plugins/inputs/file/.sincedb_7a95d797537896d7bc2d7c8449373a40", :path=>["/var/log/*.log", "/var/log/messages", "/var/log/syslog"]}
[2021-04-15T12:21:28,740][INFO ][logstash.javapipeline    ][main] Pipeline started {"pipeline.id"=>"main"}
[2021-04-15T12:21:28,774][INFO ][filewatch.observingtail  ][main][976adb32015ef413e59b22b156956b8bec525ed6230bfb57972bc53d08535932] START, creating Discoverer, Watch with file and sincedb collections
[2021-04-15T12:21:28,792][INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
{
    "syslog_severity_code" => 5,
                 "message" => "Apr 15 12:21:35 gigasui-MacBookPro Google Chrome Helper[6300]: Libnotify: notify_register_coalesced_registration failed with code 9 on line 2835",
              "syslog_pid" => "6300",
             "received_at" => "2021-04-15T03:21:36.161Z",
              "@timestamp" => 2021-04-15T03:21:35.000Z,
         "syslog_facility" => "user-level",
          "syslog_message" => "Libnotify: notify_register_coalesced_registration failed with code 9 on line 2835",
                "@version" => "1",
         "syslog_hostname" => "gigasui-MacBookPro",
                    "host" => "gigasui-MacBookPro.local",
          "syslog_program" => "Google Chrome Helper",
           "received_from" => "gigasui-MacBookPro.local",
                    "path" => "/var/log/system.log",
    "syslog_facility_code" => 1,
         "syslog_severity" => "notice",
                    "type" => "syslog",
        "syslog_timestamp" => "Apr 15 12:21:35"
}

 

 

 

편한 관리를 위해 brew services로 등록해보겠습니다.

 

pipeline.yml 에 설정된 conf 파일을 읽도록 처리가 되었기 때문에 bres services list 명령어로 상태 관리를 할 수 있습니다.

brew services start logstash

 

 

 

그리고 Logstash 자체도 REST API를 제공하고 있습니다.

 

정상적으로 실행이 되었는지 확인하기 위해 기본 설정된 9600 포트로 접속해봅니다.

curl localhost:9600/_node?pretty

 

 

 

Logstash설정이 완료 되었기 때문에 Kibana를 통해 시각화가 필요합니다.

설정에 되어있는 index가 자동으로 생성되지만 수동으로 등록 할 수도 있습니다.

 

Kibana 스택 관리 메뉴에서 index를 등록합니다.

 

http://localhost:5601/app/home#/

 

 

 

 

conf 파일의 output에 설정된 elasticsearch-> index 로 색인 등록을 할 수 있습니다.

 

syslog-demo를 입력하면 해당 인덱스를 찾았다는 문구가 보여지게 됩니다.

 

확인 후 Next step 버튼을 클릭합니다.

 

 

 

 

 

시간 필터 필드 이름으로 @timestamp 필드를 선택하고 'Create index pattern' 버특을 클릭합니다.

 

 

 

 

 

정상적으로 index pattern 등록이 되었습니다.

 

 

 

 

 

Discover 페이지를 열면 Kibana에서 syslog 데이터를 볼 수 있습니다.

 

날짜별로 필터도 가능하며 검색을 통해서 빠르게 조회가 가능합니다.

 

 

 

 

 

이렇게 Kibana를 통해서 로그를 시각화 하도록 구성을 해보았습니다.

 

728x90
반응형
728x90
반응형

 

어플리케이션이 구동 중 발생하는 Exception을 모니터링할 수 있는 시스템을 위해 ELK Stack 환경을 구성하려고 합니다.

 

 

 

ELS (ElK Stack) 구성

Java 8

Elasticsearch 7.1

Logstash 7.1

Kibana 7.1

 

 

 

Mac OS X에 ELK Stack을 구성해보겠습니다.

 

www.elastic.co/kr/

 

오픈 소스 검색: Elasticsearch, ELK Stack 및 Kibana 개발사 | Elastic

우리는 Elastic (ELK) Stack -- Elasticsearch, Kibana, Beats 및 Logstash를 만든 개발사입니다. 클라우드 또는 온-프레미스에서 데이터를 안전하고 안정적으로 검색하고 분석하고 시각화하세요.

www.elastic.co

 

 

Homebrew 설치

Homebrew를 사용하여 ELK를 설치 합니다.

 

기존 환경에 Homebrew 가 설치되어있다면 업데이트를 진행합니다.

brew update

 

 

 

설치하지 않았다면 터미널에서 아래의 명령어로 설치를 진행합니다.

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

 

 

 

 

 

Java 설치

ELK는 JVM 환경에서 동작하기 때문에 Java 설치는 필수 입니다.

 

최소 Java 8을 설치 해야 합니다.

www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html

java -version을 확인해보니 10.0.2 버전을 사용하고 있네요.

 

Mac OS X 는 기본적으로 Java 가 설치되어있음으로 해당 명령어로 현재 버전을 확인할 수 있습니다.

java -version

java version "10.0.2" 2018-07-17
Java(TM) SE Runtime Environment 18.3 (build 10.0.2+13)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.2+13, mixed mode)

 

 

 

공식 사이트 내용을 보면 Logstash는 Java9를 지원하지 않기 때문에 Java8을 맞춰줘야 됩니다.

 

만약 다른 Java 버전을 사용한다면 brew services에 등록된 상태를 보면 error로 보여집니다. (pipeline.yml 에서 오류가 발생하여 start가 안되던 문제였습니다.)

 

www.elastic.co/guide/kr/logstash/current/installing-logstash.html

 

Logstash 설치 | Logstash 참조 [5.4] | Elastic

앞서 설명한 echo 메서드를 사용하여 Logstash 리포지토리를 추가합니다. add-apt-repository`는 사용하지 마십시오. 이는 `deb-src 항목도 추가하는데 소스 패키지가 제공되지 않습니다. deb-src 항목을 추가

www.elastic.co

Logstash에는 Java 8이 필요합니다. Java 9는 지원되지 않습니다. official Oracle distribution 또는 오픈소스 배포판(예: OpenJDK)을 사용합니다.

 

 

 

vi 편집기나 open 명령어로 파일을 열어서 JAVA_HOME 환경변수를 Java 8로 변경하였습니다.

open ~/.bash_profile
or
vi ~/.bash_profile
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home

 

 

 

source 명령어를 통해 환경변수를 다시 로드 합니다.

source ~/.bash_profile

 

 

 

 

Elasticsearch 설치

www.elastic.co/kr/downloads/past-releases/elasticsearch-7-2-0

 

Elasticsearch 7.2.0 | Elastic

View the detailed release notes here. Not the version you're looking for? View past releases. The pure Apache 2.0 licensed distribution is available here. The distribution that's not bundled with a JDK is available here. You can obtain the source code for

www.elastic.co

기본 환경이 만들어졌다면 Elasticsearch 아래의 명령어로 구성 요소 설치를 진행합니다.

 

Elasticsearch는 데이터 저장소 및 검색엔진 역할을 합니다.

brew install elasticsearch && brew info elasticsearch

 

 

 

Homebrew로 Elasticsearch 를 시작합니다.

brew services start elasticsearch
==> Tapping homebrew/services
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-services'...
remote: Enumerating objects: 34, done.
remote: Counting objects: 100% (34/34), done.
remote: Compressing objects: 100% (24/24), done.
remote: Total 1155 (delta 13), reused 13 (delta 9), pack-reused 1121
Receiving objects: 100% (1155/1155), 335.91 KiB | 5.17 MiB/s, done.
Resolving deltas: 100% (490/490), done.
Tapped 1 command (41 files, 425.7KB).
==> Successfully started `elasticsearch` (label: homebrew.mxcl.elasticsearch)

 

 

 

터미널을 통해 curl 명령어로 접속하거나 브라우저를 통해 http://localhost:9200 으로 접속하면 아래와 같이 출력됩니다.

curl -X GET localhost:9200
{
  "name" : "gigasui-MacBookPro.local",
  "cluster_name" : "elasticsearch_brew",
  "cluster_uuid" : "8TGDIm0lT6-IjUmdz29zig",
  "version" : {
    "number" : "7.10.1-SNAPSHOT",
    "build_flavor" : "oss",
    "build_type" : "tar",
    "build_hash" : "unknown",
    "build_date" : "2020-12-09T19:28:12.431816Z",
    "build_snapshot" : true,
    "lucene_version" : "8.7.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

 

 

 

 

Logstash 설치

www.elastic.co/kr/downloads/past-releases/logstash-7-2-0

 

Logstash 7.2.0 | Elastic

View the detailed release notes here.

www.elastic.co

이번엔 아래의 명령어로 Logstash 설치를 진행합니다.

 

Logstash는 데이터 수집, 필터링, Elasticsearch에 색인하는 역할을 합니다.

brew install logstash

 

 

 

아직 Logstash 파이프라인을 구성하지 않아서 의미가 없지만 아래에서 구성을 진행하도록 하겠습니다.

brew services start logstash
==> Successfully started `logstash` (label: homebrew.mxcl.logstash)

 

 

 

 

Kibana 설치

www.elastic.co/kr/downloads/past-releases/kibana-7-2-0

 

Kibana 7.2.0 | Elastic

View the detailed release notes here.

www.elastic.co

ELK의 마지막 구성 요소인 Kibana를 설치하겠습니다.

 

Kibana는 수집된 데이터를 시각화 해주는 역할을 합니다.

 

아래의 명령어를 통해 Kibana 설치를 진행합니다.

brew install kibana

 

 

 

Kibana를 실행합니다.

brew services start kibana
==> Successfully started `kibana` (label: homebrew.mxcl.kibana)

 

 

 

 

Kibana를 시작하고 모든 ELK 서비스가 실행 중인지 확인합니다.

 

logstash 서비스 상태는 error로 나오는데 다음글에서 다루겠습니다.

brew services list
Name          Status  User  Plist
elasticsearch started gigas /Users/gigas/Library/LaunchAgents/homebrew.mxcl.elasticsearch.plist
kibana        started gigas /Users/gigas/Library/LaunchAgents/homebrew.mxcl.kibana.plist
logstash      error   gigas /Users/gigas/Library/LaunchAgents/homebrew.mxcl.logstash.plist

 

 

 

Kibana를 접속하려면 설정을 변경해야합니다.

 

Kibana 설정이 있는 kibana.yml 파일을 열어줍니다.

sudo vi /usr/local/etc/kibana/kibana.yml

 

 

 

server.port 와 elasticsearch.hosts 라인의 주석을 해제 합니다.

 

기본값으로 진행을 하지만 서버 환경에 맞는 설정으로 수정하면 됩니다.

server.port: 5601
elasticsearch.hosts: ["http://localhost:9200"]

 

 

기본적으로 Kibana server.host는 localhost 로 되어있습니다.

 

외부접속을 허용할 수 있도록 server.host="localhost" 주석을 해제하고 특정 ip를 허용하면 됩니다.

 

0.0.0.0 으로 모든 ip를 허용하도록 처리해보겠습니다.

server.host: "0.0.0.0"

 

 

 

수정 뒤 Kibana를 재시작 합니다.

brew services restart kibana

 

 

 

설정 수정이 완료되었다면 Kibana 상태를 보여주는 페이지이동해 봅니다.

 

정상적으로 설정이 되었다면 아래처럼 페이지 내용이 보여집니다.

http://localhost:5601/status

 

 

이것으로 기본적은 설치를 마무리 하였습니다.

 

728x90
반응형

+ Recent posts