ELK 安裝部署小計

ELK的安裝部署已是第N次了! 其實也很簡單,這裏記下來,以避免忘記。html

#elasticsearch安裝部署
wget  https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.1.tar.gz
tar -zxvf  elasticsearch-6.0.1.tar.gz
cd elasticsearch-6.0.1

#配置。 以下 集羣名稱;節點名稱;供外網訪問的ip(xxx.xxx.xxx.xxx或0.0.0.0);端口(注意空格)
vi config/elasticsearch.yml
cluster.name: my-application
node.name: node-1
network.host: ip
http.port: 9200

修改系統參數:

  echo "*               soft    nofile          65536
  *               hard    nofile          65536" >>  /etc/security/limits.confjava

  echo "vm.max_map_count=262144"  >>  /etc/sysctl.confnode


#啓動
useradd es # 須要非root 用戶
su es
./bin/elasticsearch -d 
# ./elasticsearch -q   關閉
exit
cd .. #訪問 curl ip:
9200 #kibana安裝部署 wget https://artifacts.elastic.co/downloads/kibana/kibana-6.0.1-linux-x86_64.tar.gz tar -zxvf kibana-6.0.1-linux-x86_64.tar.gz cd kibana-6.0.1 vi config/kibana.yml #配置信息 服務端口;kibana服務ip;es的外網訪問ip;index server.port: 5601 server.host: "0.0.0.0" elasticsearch.url: "http://xxx.xxx.xxx.xxx:9200" # 注意ip、url不能使用localhost、127.0.0.1, 必須使用實際的ip!!! kibana.index: ".kibana" #啓動 nohup ./bin/kibana &
cd ..
#訪問 curl ip:5601 #Logstash安裝部署 wget https://artifacts.elastic.co/downloads/logstash/logstash-6.0.1.tar.gz tar -zxvf logstash-6.0.1.tar.gz cd logstash-6.0.1 #配置 vi logstash-6.0.1/config/logs_to_es.conf input { file { type => "tomcat-catalina" path => "/opt/apps/apache-tomcat7/logs/catalina.log" codec => multiline { pattern => "^\s" what => "previous" } } } filter { #Only matched data are send to output. } output { elasticsearch { action => "index" #The operation on ES hosts => "xxx.xxx.xxx.xxx:9200" #ElasticSearch host, can be array. index => "tomcat_log" #The index to write data to. } } #啓動 nohup ./bin/logstash -f config/logs_to_es.conf &
cd ..
測試: # Logstash管道測試代碼 bin
/logstash -e 'input{stdin {}} output{stdout{}}' # 參考 https://blog.csdn.net/zhaojiweiwin/article/details/80281525

上面的腳本,只要把vi 部分換成sed -i 或相似免交互的命令,那麼實際上是能夠一鍵 快速完成ELK的安裝部署。 須要注意的是 ip 是不能使用localhost 或 127.0.0.1的, 而是須要實際的ip。須要注意的是,es啓動以前須要設置一下linux系統的一些參數: /etc/security/limits.conf,  /etc/sysctl.conf,不然會啓動報錯。至於爲何,我以爲多是es須要打開不少不少的文件句柄。 nofile實際上是最大可以打開的文件數,跟ulimit -n含義差很少,可是經過ulimit -n設置是臨時的,經過/etc/security/limits.conf設置纔是永久的;max_map_count 是虛擬內存映射,是容許一個進程在VMAs(虛擬內存區域)擁有最大數量,VMA是一個連續的虛擬地址空間,當進程建立一個內存映像文件時VMA的地址空間就會增長,當達到max_map_count了就是返回out of memory errors。它也能夠經過sysctl -w進行設置,可是也是臨時的,須要寫入  /etc/sysctl.conf纔是永久的。linux

 

固然,上面的logstash 的配置文件是很示例的,可能不夠。 我實際上使用的是下面的配置:正則表達式

input {
   file {
        type => "erdp-rc"
        #path => "/app/java/logs/nohup-erdp_${WORD:app}-*.log"
        path => "/app/java/logs/nohup-erdp_*.log"
        #add_field => {"app2"=>"aa"}
        codec => multiline {
            pattern => "^%{TIMESTAMP_ISO8601}"
            negate => true
            what => "previous"
        }
    }
}
filter {
  #Only matched data are send to output.
  grok {
    # match => { "message" => "%{TIMESTAMP_ISO8601:timestamp}\s? %{LOGLEVEL:level} %{INT:pid} --- \[%{URIPATHPARAM:thread}\] %{NOTSPACE:clz}\s+: %{GREEDYDATA:msg}" }
    match => { "message" => "%{TIMESTAMP_ISO8601:timestamp}\s? %{LOGLEVEL:level} %{INT:pid} --- \[%{NOTSPACE:thread}\] %{NOTSPACE:clz}\s+: %{GREEDYDATA:msg}" } 
  }

grok {
# match => ["path","%{GREEDYDATA}/nohup-erdp_%{WORD:appName}_%{GREEDYDATA}\.log"] match
=> ["path","%{GREEDYDATA}/nohup-erdp_(?<appName>[a-zA-Z0-9.-]+)_%{DATA}\.log"] } # date { # match => [ "timestamp" , "YYYY-MM-dd HH:mm:ss.SSS" ] # } } output { elasticsearch { action => "index" #The operation on ES hosts => "192.168.11.183:9200" #ElasticSearch host, can be array. index => "erdp_log" #The index to write data to. } }

上面的兩個grok 花了我很多時間。有些蛋疼。grok確實是個麻煩的玩意,每次都要折騰一番。 由於 Logstash不方便調試,須要修改conf,而後重啓,而後操做,而後等待日誌輸出到elk,而後kibana上面觀察。觀察不到呢, 還要懷疑是不是本身的查詢條件寫錯了,各類修改、折騰。這樣的一次手動調試下來須要2-6分鐘。 在線的grok debugger又用不了。 真是麻煩。apache

 

如上,能夠看到 URIPATHPARAM 用來匹配線程 thread  就出問題了! 開始一直沒懷疑。爲何URIPATHPARAM 不行,而NOTSPACE 就能夠呢?以下
tomcat

 

URIPATH (?:/[A-Za-z0-9$.+!*'(){},~:;=@#%_\-]*)+
#URIPARAM \?(?:[A-Za-z0-9]+(?:=(?:[^&]*))?(?:&(?:[A-Za-z0-9]+(?:=(?:[^&]*))?)?)*)?
URIPARAM \?[A-Za-z0-9$.+!*'|(){},~@#%&/=:;_?\-\[\]]*
URIPATHPARAM %{URIPATH}(?:%{URIPARAM})?

 

我感受是匹配到 URIPATHPARAM  後面的就出問題了,可是Logstash 沒有報錯。 因此,問題一直排查不出來。app

 

另外,須要經過文件名, 找到對應的應用,添加一個app_name 的字段,搞了很久啊。curl

最開始的時候想經過input-file-add_field 插件添加進來,發現input-file 的path 沒法使用分組,沒法將文件名讀取到,其餘通配符也無效。。elasticsearch

 

搜索「logstash path  添加字段」 ,不行。 後面搜索「logstash get the file name as field」終於找到了

https://stackoverflow.com/questions/23780000/use-grok-to-add-the-log-filename-as-a-field-in-logstash

https://stackoverflow.com/questions/22916200/logstash-how-to-add-file-name-as-a-field

(其實以前找到了 http://www.voidcn.com/article/p-rueddyth-btd.html, 可是以爲這樣效率低,我就想經過add_field,而不想經過grok 的方式

後面明白,只能經過grok 的方式了! 仔細想一想, 其實grok 的方式的效率應該是也是差很少的。

另外注意到 filter的 grok 是能夠多個的, input 的file 其實也能夠多個並行。

 

可是,我須要經過log文件名再截取一段,appName, 發現 %{WORD:appName}, 發現死活不行,或時好時壞, 後面改爲 [a-zA-Z0-9.-]+), 就終於好了!浪費一兩個小時時間啊!

仔細檢查,原來啊, WORD 是必須有邊界的!——> WORD \b\w+\b 。 我開始還在懷疑 自定義的 grok 語法是否是搞錯了呢! --> (?<field>regex) , 後面又懷疑GREEDYDATA是否是應該改成DATA。 其實都不是的。

 

附常見的內置的gork 正則表達式:

USERNAME [a-zA-Z0-9._-]+
USER %{USERNAME}
INT (?:[+-]?(?:[0-9]+))
BASE10NUM (?<![0-9.+-])(?>[+-]?(?:(?:[0-9]+(?:\.[0-9]+)?)|(?:\.[0-9]+)))
NUMBER (?:%{BASE10NUM})
BASE16NUM (?<![0-9A-Fa-f])(?:[+-]?(?:0x)?(?:[0-9A-Fa-f]+))
BASE16FLOAT \b(?<![0-9A-Fa-f.])(?:[+-]?(?:0x)?(?:(?:[0-9A-Fa-f]+(?:\.[0-9A-Fa-f]*)?)|(?:\.[0-9A-Fa-f]+)))\b

POSINT \b(?:[1-9][0-9]*)\b
NONNEGINT \b(?:[0-9]+)\b
WORD \b\w+\b
NOTSPACE \S+
SPACE \s*
DATA .*?
GREEDYDATA .*
QUOTEDSTRING (?>(?<!\\)(?>」(?>\\.|[^\\"]+)+」|」"|(?>’(?>\\.|[^\\']+)+’)|」|(?>(?>\\.|[^\]+)+)|`))
UUID [A-Fa-f0-9]{8}-(?:[A-Fa-f0-9]{4}-){3}[A-Fa-f0-9]{12}


MAC (?:%{CISCOMAC}|%{WINDOWSMAC}|%{COMMONMAC})
IPV4 (?<![0-9])(?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2}))(?![0-9])

IP (?:%{IPV6}|%{IPV4})
HOSTNAME \b(?:[0-9A-Za-z][0-9A-Za-z-]{0,62})(?:\.(?:[0-9A-Za-z][0-9A-Za-z-]{0,62}))*(\.?|\b)
HOST %{HOSTNAME}
IPORHOST (?:%{HOSTNAME}|%{IP})
HOSTPORT (?:%{IPORHOST=~/\./}:%{POSINT})


# Years?
YEAR (?>\d\d){1,2}
HOUR (?:2[0123]|[01]?[0-9])
MINUTE (?:[0-5][0-9])
# ’60is a leap second in most time standards and thus is valid.

SECOND (?:(?:[0-5][0-9]|60)(?:[:.,][0-9]+)?)
TIME (?!<[0-9])%{HOUR}:%{MINUTE}(?::%{SECOND})(?![0-9])
# datestamp is YYYY/MM/DD-HH:MM:SS.UUUU (or something like it)
DATE_US %{MONTHNUM}[/-]%{MONTHDAY}[/-]%{YEAR}
DATE_EU %{MONTHDAY}[./-]%{MONTHNUM}[./-]%{YEAR}
ISO8601_TIMEZONE (?:Z|[+-]%{HOUR}(?::?%{MINUTE}))
ISO8601_SECOND (?:%{SECOND}|60)
TIMESTAMP_ISO8601 %{YEAR}-%{MONTHNUM}-%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?%{ISO8601_TIMEZONE}?
DATE %{DATE_US}|%{DATE_EU}
DATESTAMP %{DATE}[- ]%{TIME}
TZ (?:[PMCE][SD]T|UTC)
DATESTAMP_RFC822 %{DAY} %{MONTH} %{MONTHDAY} %{YEAR} %{TIME} %{TZ}
DATESTAMP_OTHER %{DAY} %{MONTH} %{MONTHDAY} %{TIME} %{TZ} %{YEAR}


# Log Levels
LOGLEVEL ([A-a]lert|ALERT|[T|t]race|TRACE|[D|d]ebug|DEBUG|[N|n]otice|NOTICE|[I|i]nfo|INFO|[W|w]arn?(?:ing)?|WARN?(?:ING)?|[E|e]rr?(?:or)?|ERR?(?:OR)?|[C|c]rit?(?:ical)?|CRIT?(?:ICAL)?|[F|f]atal|FATAL|[S|s]evere|SEVERE|EMERG(?:ENCY)?|[Ee]merg(?:ency)?)

 

 

 參考

http://www.javashuo.com/article/p-hcgrvtap-bk.html

https://blog.csdn.net/teaey/article/details/21626621

相關文章
相關標籤/搜索