再彈ELK+filebeat(二)

也不知道是不是升級的原因,還是一年前沒有把搭建踩坑沒記錄下來,導致一年後的今天項目要使用  又要填坑一次

elk的搭建網上比較全而雜,官網https://www.elastic.co/guide/index.html清晰明瞭,會有部分小細節未。。安裝方式和配置就不多說,
1:filebeat 採取宿主機安裝,規避docker容器考慮到(filebeat)容器內讀取各實例掛載的log文件,會比較繁瑣(curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.6.1-linux-x86_64.tar.gz)參考:elastic官網底子好
2:Step 2: Configure Filebeat(https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-configuration.html

按慣例:這裏我貼上自己 filebeat配置文件,elk7.6.1 以tag作標識->logstash->es

#filebeat.config:
#  modules:
#    path: ${path.config}/modules.d/*.yml
#    reload.enabled: false

#filebeat.autodiscover:
#  providers:
#    - type: docker
#      hints.enabled: true

#processors:
#- add_cloud_metadata: ~

#output.elasticsearch:
#  hosts: ['172.18.141.169:9200']
  #username: '${ELASTICSEARCH_USERNAME:}'
  #password: '${ELASTICSEARCH_PASSWORD:}'
#setup.kibana:
#  host: "172.18.141.169:5601"

filebeat.inputs:
- type: log
  enabled: true
  paths:
     # 需要收集的日誌所在的位置,可使用通配符進行配置
    - /alex/data/hnjk-web-rest-prod/logs/info.log  # 監控的日誌
  tags: ["rest-info"]               # 用於實現多日誌收集

- type: log
  enabled: true
  paths:
    - /alex/data/hnjk-web-rest-prod/logs/error.log
  tags: ["rest-error"]
  
- type: log
  enabled: true
  paths:
    - /alex/data/hnjk-cec-oas-prod/logs/info.log
  tags: ["oas-info"]
  
- type: log
  enabled: true
  paths:
    - /alex/data/hnjk-cec-oas-prod/logs/error.log
  tags: ["oas-error"]

#日誌輸出配置(採用 logstash 收集日誌,5044爲logstash端口)
output.logstash:
  enabled: true
  hosts: ['172.18.141.169:5044']

2:elk用docker 跑的,爲了方便參考之前的文章https://blog.csdn.net/qq_32447321/article/details/86539610

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

input {
   beats {
    port => 5044
  }
}
filter {
#	if "beats_input_codec_plain_applied" in [tags] {
           mutate {
            	remove_tag => ["beats_input_codec_plain_applied"]
            }
#	}
# 	mutate {
#      	   split => ["message", "|"]
#	}
# split {
#        field => "message"
#        terminator => "|"
#    }
    grok {
            
          # 篩選過濾
          match => {
#logstash 時間轉換 eg:在日誌文件中原生日誌是這樣子的:2020-03-20 18:04:15.331 ISO8601形式重點是後面的”.782“,後面附加以毫秒爲單位的。那麼grok插件中可以這樣子定義匹配的規則(%{TIMESTAMP_ISO8601:dataTime})
            "message" => "(?m)\s*%{TIMESTAMP_ISO8601:dataTime}\|(?<thread>[A-Za-z0-9/-]{4,40})\|(?<level>[A-Z]{4,5})\s\|(?<class>[A-Za-z0-9/.]{4,40})\|(?<msg>.*) "

#           "message" => "(?<date>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}.\d{3})\|(?<thread>[A-Za-z0-9/-]{4,40})\|(?<level>[A-Z]{4,5})\s\|(?<class>[A-Za-z0-9/.]{4,40})\|(?<msg>.*)"
 	  }
         remove_field => ["message"]
     }
}

output {

	if "rest-info" in [tags] {     # 通過判斷標籤名,爲不同的日誌配置不同的index
               elasticsearch {
                   hosts => ["172.18.141.169:9200"]
                   index => "rest-info-%{+YYYY.MM.dd}"  # 索引名不能大寫
                   template_overwrite => true
               }
	       stdout { codec => rubydebug }
    }
	else if "rest-error" in [tags] {
               elasticsearch {
                   hosts => ["172.18.141.169:9200"]
                   index => "rest-error-%{+YYYY.MM.dd}"
                   template_overwrite => true
               }
	       stdout { codec => rubydebug }
    }
	else if "oas-info" in [tags] {
               elasticsearch {
                   hosts => ["172.18.141.169:9200"]
                   index => "oas-info-%{+YYYY.MM.dd}"
                   template_overwrite => true
               }
		stdout { codec => rubydebug }
    }
	else if "oas-error" in [tags] {
               elasticsearch {
                   hosts => ["172.18.141.169:9200"]
                   index => "oas-error-%{+YYYY.MM.dd}"
                   template_overwrite => true
               }
		stdout { codec => rubydebug }
    }
	else{
		elasticsearch {
                   hosts => ["172.18.141.169:9200"]
                   index => "hnjk-other-%{+YYYY.MM.dd}"
                   template_overwrite => true
               }
                stdout { codec => rubydebug }
	}

}

$ ./logstash -t -f /etc/logstash/confi.d/30-logstash.conf   #上面文件if判斷了{}有點多,可以用-t來驗證一下配置文件而不啓動,結尾出現下面就是可以了

  1. Configuration OK
    
    [2017-12-07T19:38:07,082][INFO ][logstash.runner ] Using config.test_and_exit mode. Config Validation Result: OK. Exiting Logstash

     

  2. #logstash 時間轉換 eg:在日誌文件中原生日誌是這樣子的:2020-03-20 18:04:15.331 ISO8601形式重點是後面的”.782“,後面附加以毫秒爲單位的。那麼grok插件中可以這樣子定義匹配的規則(%{TIMESTAMP_ISO8601:dataTime})。
    參考:https://github.com/elastic/elasticsearch/tree/master/libs/grok/src/main/resources/patterns
     

  3. $ ./logstash -t -f /etc/logstash/confi.d/logstash-sample.conf   #指定配置文件前臺啓動,我們先看看輸出。

使用到工具 :

           Grok位於正則表達式說明: 參考https://blog.csdn.net/qq_41262248/article/details/79977925
           校驗grok地址:http://grok.51vagaa.com/

2020-03-20 18:04:15.331|http-nio-8080-exec-3|WARN |c.e.h.i.StopWatchHandlerInterceptor|/api/bigScreen/day/infaultTop20 consume 785 millis

(?<date>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}.\d{3})\|(?<thread>[A-Za-z0-9/-]{4,40})\|(?<level>[A-Z]{4,5})\s\|(?<class>[A-Za-z0-9/.]{4,40})\|(?<msg>.*) 

elk運行遇到問題:

step 1 ------#filebeat啓動 lumberjack protocol error   : 鏈接:https://www.jianshu.com/p/5df9db5cda8f

  /etc/logstash/conf.d/02-beats-input.conf修改成如下圖所示:將以下三行刪除掉。這三行的意思是是否使用證書,本例是不使用證書的,如果你需要使用證書,將logstash.crt拷貝到客戶端,然後在filebeat.yml裏面添加路徑即可

ssl => true 
ssl_certificate => "/pki/tls/certs/logstash.crt"
ssl_key => "/pki/tls/private/logstash.key"

注意:sebp/elk docker是自建立了一個證書logstash.crt,默認使用*通配配符,如果你使用證書,filebeat.yml使用的服務器地址必須使用域名,不能使用IP地址,否則會報錯

這裏如果不去掉這三行配置的話,在後面啓動filebeat時,會提示如下錯誤:

2018-09-12T10:01:29.770+0800    ERROR   logstash/async.go:252   Failed to publish events caused by: lumberjack protocol error
2018-09-12T10:01:29.775+0800    ERROR   logstash/async.go:252   Failed to publish events caused by: client is not connected
2018-09-12T10:01:30.775+0800    ERROR   pipeline/output.go:109  Failed to publi


step 2---------

  在kinana裏面僅有一個filebeat-*的索引,tag有(rest-info/rest-error/oas-info/oas-err)不過每條記錄都多出了一個beats_input_codec_plain_applied(es默認的);百度下發現是logstash -> es默認的, 怎麼辦?那就最容易想到的刪了唄

#	if "beats_input_codec_plain_applied" in [tags] {
           mutate {
            	remove_tag => ["beats_input_codec_plain_applied"]
            }
#	}

 

這裏存在一個疑問:明明我已經自定義了4個匹配規則logstash 的output 即使沒有匹配上也會到hnjk-else索引的;爲什麼還是會用beats_input_codec_plain_applied;不行還是有問題沒解決:

沒有絲路那就看啓動elk的日誌吧,elk封裝模塊(es,logstash,kinaba),當然也罷日誌封裝了;docker雖然方便 了但是這裏就體現了不方便;想起來ab在央視採訪是說到“上帝給了我這個容顏,一定會讓我得到些什麼,又會失去些什麼”shit happens..

 雖然logstash在output裏面進行自定義index和filter 但是kibana裏面依然沒有自動加載到es的索引(rest-info-*/rest-error-*/oas-info-*/oas-err-*)還要繼續找原因... 後續根據docker啓動elk的日誌發現  logstash 加載的環境在/etc/logstash/confi.d/

02-beats-input.conf  10-syslog.conf  11-nginx.conf  30-output.conf  30-output.conf-bk(源)

看到這個output就明白七七八八了,緣來logstash配置默認加載的文件在這裏藏着阿,我自以爲定義的logstash-sample.conf(/opt/logstash/conf/logstash-sample.conf)都是假象; 改之,果然ok了

修改完後,改有的都有了,不再僅僅一個filebeat-*索引了(30-output-conf-bk 也印證了之前 就filebeat-*這個一個索引問題,並非是es不再自動加載index的原因); 這纔是真正的自定義;當時還真信了官網的鬼話,es7.6.1以後要自己添加索引,不會自動讀取logstash中的配置,shit 。後續補充:(其實人家只是說自己模板)

至此:已完成elk+filebeat部署,正式環境準備用kafaka 替掉filebeat作 ,待續

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章