ELK日誌分析之安裝

ELK日誌分析之安裝

1.介紹:

  • NRT 
    elasticsearch是一個近似實時的搜索平臺,從索引文檔到可搜索有些延遲,一般爲1秒。
  • 集羣 
    集羣就是一個或多個節點存儲數據,其中一個節點爲主節點,這個主節點是能夠經過選舉產生的,並提供跨節點的聯合索引和搜索的功能。集羣有一個惟一性標示的名字,默認是elasticsearch,集羣名字很重要,每一個節點是基於集羣名字加入到其集羣中的。所以,確保在不一樣環境中使用不一樣的集羣名字。一個集羣能夠只有一個節點。強烈建議在配置elasticsearch時,配置成集羣模式。
  • 節點 
    節點就是一臺單一的服務器,是集羣的一部分,存儲數據並參與集羣的索引和搜索功能。像集羣同樣,節點也是經過名字來標識,默認是在節點啓動時隨機分配的字符名。固然啦,你能夠本身定義。該名字也蠻重要的,在集羣中用於識別服務器對應的節點。 

         節點能夠經過指定集羣名字來加入到集羣中。默認狀況下,每一個節點被設置成加入到elasticsearch集羣。若是啓動了多個節點,假設能自動發現對方,他們將會自動組建一個名爲                             elasticsearch的集羣。php

  • 索引 
    索引是有幾分類似屬性的一系列文檔的集合。如nginx日誌索引、syslog索引等等。索引是由名字標識,名字必須所有小寫。這個名字用來進行索引、搜索、更新和刪除文檔的操做。 
    索引相對於關係型數據庫的庫。
  • 類型 
    在一個索引中,能夠定義一個或多個類型。類型是一個邏輯類別仍是分區徹底取決於你。一般狀況下,一個類型被定於成具備一組共同字段的文檔。如ttlsa運維生成時間全部的數據存入在一個單一的名爲logstash-ttlsa的索引中,同時,定義了用戶數據類型,帖子數據類型和評論類型。 
    類型相對於關係型數據庫的表。
  • 文檔 
    文檔是信息的基本單元,能夠被索引的。文檔是以JSON格式表現的。 
    在類型中,能夠根據需求存儲多個文檔。 
    雖然一個文檔在物理上位於一個索引,實際上一個文檔必須在一個索引內被索引和分配一個類型。 
    文檔相對於關係型數據庫的列。
  • 分片和副本 
    在實際狀況下,索引存儲的數據可能超過單個節點的硬件限制。如一個十億文檔需1TB空間可能不適合存儲在單個節點的磁盤上,或者從單個節點搜索請求太慢了。爲了解決這個問題,elasticsearch提供將索引分紅多個分片的功能。當在建立索引時,能夠定義想要分片的數量。每個分片就是一個全功能的獨立的索引,能夠位於集羣中任何節點上。 
    分片的兩個最主要緣由: 
    a、水平分割擴展,增大存儲量 
    b、分佈式並行跨分片操做,提升性能和吞吐量 
    分佈式分片的機制和搜索請求的文檔如何彙總徹底是有elasticsearch控制的,這些對用戶而言是透明的。 
    網絡問題等等其它問題能夠在任什麼時候候不期而至,爲了健壯性,強烈建議要有一個故障切換機制,不管何種故障以防止分片或者節點不可用。 
    爲此,elasticsearch讓咱們將索引分片複製一份或多份,稱之爲分片副本或副本。 
    副本也有兩個最主要緣由: 
    高可用性,以應對分片或者節點故障。出於這個緣由,分片副本要在不一樣的節點上。 
    提供性能,增大吞吐量,搜索能夠並行在全部副本上執行。 
    總之,每個索引能夠被分紅多個分片。索引也能夠有0個或多個副本。複製後,每一個索引都有主分片(母分片)和複製分片(複製於母分片)。分片和副本數量能夠在每一個索引被建立時定義。索引建立後,能夠在任什麼時候候動態的更改副本數量,可是,不能改變分片數。 
    默認狀況下,elasticsearch爲每一個索引分片5個主分片和1個副本,這就意味着集羣至少須要2個節點。索引將會有5個主分片和5個副本(1個完整副本),每一個索引總共有10個分片。 
    每一個elasticsearch分片是一個Lucene索引。一個單個Lucene索引有最大的文檔數LUCENE-5843, 文檔數限制爲2147483519(MAX_VALUE – 128)。 可經過_cat/shards來監控分片大小。
  •  索引和類型的解釋:

 

  • ELK的含義:

E: elasticsearchhtml

  ElasticSearch是一個基於Lucene的搜索服務器。它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful web接口。java

  也就是將logstach收集上來的日誌儲存,創建索引(便於查找),搜索(提供web展現)node

l:logstashpython

  收集日誌mysql

  數據源:各類log,文本,session,silk,snmplinux

k:kibananginx

  數據展現,web頁面,可視化git

  能夠完成批量分析web

  數據集之間關聯

  產生圖表

  報警 (python / R 語言 )

  ES python api的文檔

  大量的查詢或者過濾選項可使用json 語法:
  任何週期都能查詢

 

  •  ELK 關係:

LEK : logstatsh 收集日誌,存到elasticserach (存儲,產生索引,搜索) 到kibana展示(view)
 
 

2.安裝

一、下載tar包直接解壓(靈活)

二、配置yum源直接安裝(方便)

服務器部署:

logstatsh : 部署在想收集日誌的服務器上。

elasticsearch:主要是用於數據收集,索引,搜索提供展現,隨意安裝在那臺服務器上均可以,重要的是es支持分佈式,並且再大規模的日誌分析中必須作分佈式集羣。這樣能夠跨節點索引和搜索。提升吞吐量與計算能力。

kibana:數據展現,部署在任意服務器上。

 

這裏咱們作實驗使用的是兩臺服務器

1
2
node1.wawa.com : 192.168.31.179
node2.wawa.com : 192.168.31.205

a、準備環境:

  配置hosts兩臺服務器網絡通暢  

  node1 安裝es,node2安裝es 作成集羣,後期可能還會用到redis,redis提供的功能至關於kafka,收集logstatsh發來的數據,es從redis中提取數據。

  node1 安裝kibana 作數據展現

  node2 安裝logstatsh 作數據收集

  建立  elasticsearch 用戶

b、安裝:

  因爲es logstatsh kibana基於java 開發,因此安裝jdk ,jdk版本不要太低,不然會提醒升級jdk。

安裝elasticsearch(node1,node2全都安裝es)

下載並安裝GPG key

2.x

1
[root@linux-node1 ~] # rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch

 

5.1

 

1
rpm -- import  https: //artifacts .elastic.co /GPG-KEY-elasticsearch

 

  

 

 

添加yum倉庫 

1
2
3
4
5
6
7
[root@linux-node2 ~] # vim /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-2.x]
name=Elasticsearch repository  for  2.x packages
baseurl=http: //packages .elastic.co /elasticsearch/2 .x /centos
gpgcheck=1
gpgkey=http: //packages .elastic.co /GPG-KEY-elasticsearch
enabled=1

 

 

1
2
3
4
5
6
7
8
[elasticsearch-5.x]
name=Elasticsearch repository  for  5.x packages
baseurl=https: //artifacts .elastic.co /packages/5 .x /yum
gpgcheck=1
gpgkey=https: //artifacts .elastic.co /GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type =rpm-md

 

 

es須要jdk8,可是因爲服務器有的業務須要1.7,因此可讓兩個共存  

 

 

 

安裝elasticsearch

1
[root@hadoop-node2 ~] # yum install -y elasticsearch

 

問題:

阿里服務器下載和用yum安裝因爲連接是https的問題報錯

增長yum 源報錯

[root@szdz-SLAVE svr]# yum repolist
Loaded plugins: security
https://artifacts.elastic.co/packages/5.x/yum/repodata/repomd.xml: [Errno 14] PYCURL ERROR 51 - "SSL: certificate subject name 'server.co.com' does not match target host name 'artifacts.elastic.co'"

 

下載GPG key

[root@szdz-SLAVE src]# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
curl: (6) Couldn't resolve host 'artifacts.elastic.co'
error: https://artifacts.elastic.co/GPG-KEY-elasticsearch: import read failed(2).
[root@szdz-SLAVE src]# curl  https://artifa

 

 

  • 下載tar包安裝,更簡單,解壓便可運行,只不過沒有yum安裝提供的啓動腳本

安裝kibana(這裏使用的tar包安裝,es、log tar包方法同樣)

1
2
3
4
5
[root@linux-node2 ~] #cd /usr/local/src
[root@linux-node2 ~] #wget https://download.elastic.co/kibana/kibana/kibana-4.3.1-linux-x64.tar.gz
tar  zxf kibana-4.3.1-linux-x64. tar .gz
[root@linux-node1 src] # mv kibana-4.3.1-linux-x64 /usr/local/
[root@linux-node2 src] # ln -s /usr/local/kibana-4.3.1-linux-x64/ /usr/local/kibana

 

安裝logstatsh (node2安裝)

下載並安裝GPG key

1
[root@linux-node2 ~] # rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch 

添加yum倉庫  

1
2
3
4
5
6
7
[root@linux-node2 ~] # vim /etc/yum.repos.d/logstash.repo
[logstash-2.1]
name=Logstash repository  for  2.1.x packages
baseurl=http: //packages .elastic.co /logstash/2 .1 /centos
gpgcheck=1
gpgkey=http: //packages .elastic.co /GPG-KEY-elasticsearch
enabled=1 

安裝logstash  

1
[root@linux-node2 ~] # yum install -y logstash

  

c、配置管理elasticsearch

1
2
3
4
5
6
7
8
9
10
[root@linux-node1 src] # grep -n '^[a-Z]' /etc/elasticsearch/elasticsearch.yml
17:cluster.name: chuck-cluster  判別節點是不是統一集羣,多臺統一集羣的es名稱要一致
23:node.name: linux-node1 節點的 hostname
33:path.data:  /data/es-data  數據存放路徑
37:path.logs:  /var/log/elasticsearch/  日誌路徑
43:bootstrap.memory_lock:  true  鎖住內存,使內存不會再swap中使用
54:network.host: 0.0.0.0  容許訪問的ip
58:http.port: 9200  端口
[root@linux-node1 ~] # mkdir -p /data/es-data
[root@linux-node1 src] # chown  elasticsearch.elasticsearch /data/es-data/

  

d、啓動 elasticsearch

複製代碼
[root@node2 ~]# /etc/init.d/elasticsearch status
elasticsearch (pid  23485) 正在運行...
You have new mail in /var/spool/mail/root
[root@node2 ~]# ps aux| grep elasticsearch
505      23485  2.1 53.1 2561964 264616 ?      Sl   17:09   6:07 /usr/bin/java -Xms256m -Xmx1g -Djava.awt.headless=true -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpOnOutOfMemoryError -XX:+DisableExplicitGC -Dfile.encoding=UTF-8 -Djna.nosys=true -Des.path.home=/usr/share/elasticsearch -cp /usr/share/elasticsearch/lib/elasticsearch-2.4.2.jar:/usr/share/elasticsearch/lib/* org.elasticsearch.bootstrap.Elasticsearch start -p /var/run/elasticsearch/elasticsearch.pid -d -Des.default.path.home=/usr/share/elasticsearch -Des.default.path.logs=/var/log/elasticsearch -Des.default.path.data=/var/lib/elasticsearch -Des.default.path.conf=/etc/elasticsearch
root     26425  0.0  0.1 103260   844 pts/0    S+   21:57   0:00 grep elasticsearch
[root@node2 ~]# ss -tunlp | grep elasticsearch
[root@node2 ~]# ss -tunlp | grep 23485
tcp    LISTEN     0      50                    :::9200                 :::*      users:(("java",23485,132))
tcp    LISTEN     0      50                    :::9300                 :::*      users:(("java",23485,89))
複製代碼

 

啓動問題:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@szdz-SLAVE svr] # /etc/init.d/elasticsearch start
正在啓動 elasticsearch:Exception  in  thread  "main"  BindTransportException[Failed to bind to [9300-9400]]; nested: ChannelException[Failed to bind to:  /221 .223.97.142:9400]; nested: BindException[沒法指定被請求的地址];
Likely root cause: java.net.BindException: 沒法指定被請求的地址
     at sun.nio.ch.Net.bind0(Native Method)
     at sun.nio.ch.Net.bind(Net.java:344)
     at sun.nio.ch.Net.bind(Net.java:336)
     at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:199)
     at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
     at org.jboss.netty.channel.socket.nio.NioServerBoss$RegisterTask.run(NioServerBoss.java:193)
     at org.jboss.netty.channel.socket.nio.AbstractNioSelector.processTaskQueue(AbstractNioSelector.java:391)
     at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:315)
     at org.jboss.netty.channel.socket.nio.NioServerBoss.run(NioServerBoss.java:42)
     at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108)
     at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42)
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
     at java.lang.Thread.run(Thread.java:722)
Refer to the log  for  complete error details.

network.host: 要填寫本機的ip地址,最好是內網。

 

e、測試

交互方式:

交互的兩種方法

  • Java API : 
    node client 
    Transport client
  • RESTful API 
    Javascript 
    .NET 
    php 
    Perl 
    Python 
    Ruby
  •  ElasticSearch是一個基於Lucene的搜索服務器。它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful web接口。

 一、咱們使用RESTful web接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@linux-node1 src] # curl -i -XGET 'http://192.168.56.11:9200/_count?pretty' -d '{
"query"  {    #查詢
      "match_all" : {}    #全部信息
}
}'<br> ####################<br>HTTP/1.1 200 OK
Content-Type: application /json ; charset=UTF-8
Content-Length: 95
{
   "count"  : 0,     索引0個
   "_shards"  : {    分區0個
     "total"  : 0,
     "successful"  : 0, 成功0個
     "failed"  : 0      失敗0個
   }
}

  

二、使用es 強大的插件  : head插件顯示索引和分片狀況

 

f、安裝插件

1
2
[root@linux-node1 src] # /usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head
[root@linux-node1 src] # /usr/share/elasticsearch/bin/plugin list 能夠查看當前已經安裝的插件

 

 

訪問剛剛安裝的head插件

1
http: //192 .168.31.179:9200 /_plugin/head/

  

 

添加數據測試

 

 

 

  

 

增長:

命令行插入數據與查詢數據(RESTful接口處理的JSON請求)

1
curl -XPOST http: //127 .0.0.1:9330 /logstash-2017 .01.09 /testlog  -d  '{"date":"123456","user":"chenlin7","mesg":"first mesasge"}'

 

返回值

1
{ "_index" : "logstash-2017.01.09" , "_type" : "testlog" , "_id" : "AVmBUmd9WXPobNRX0V5f" , "_version" :1, "_shards" :{ "total" :2, "successful" :1, "failed" :0}, "created" : true }

能夠看到,在數據寫入的時候,會返回該數據的 。這就是後續用來獲取數據 的關鍵: 

 

獲取數據

1
curl -XGET http: //127 .0.0.1:9330 /logstash-2017 .01.09 /testlog/AVmBUmd9WXPobNRX0V5f

返回值:

1
{ "_index" : "logstash-2017.01.09" , "_type" : "testlog" , "_id" : "AVmBUmd9WXPobNRX0V5f" , "_version" :1, "found" : true , "_source" :{ "date" : "123456" , "user" : "chenlin7" , "mesg" : "first mesasge" }}

這個 裏的內容,正是以前寫入的數據。 

若是以爲這個返回看起來有點太過麻煩,可使用_source 直接指定要獲取內容

1
curl -XGET http: //127 .0.0.1:9330 /logstash-2017 .01.09 /testlog/AVmBUmd9WXPobNRX0V5f/_source

返回值

1
{ "date" : "123456" , "user" : "chenlin7" , "mesg" : "first mesasge" }

 

也能夠直接指定字段:

curl -XGET http://115.29.229.72:9330/logstash-2017.01.09/testlog/AVmBUmd9WXPobNRX0V5f\?fields\=user,mesg

 

返回值

1
{ "_index" : "logstash-2017.01.09" , "_type" : "testlog" , "_id" : "AVmBUmd9WXPobNRX0V5f" , "_version" :1, "found" : true , "fields" :{ "user" :[ "chenlin7" ], "mesg" :[ "first mesasge" ]}}%

 

刪除

刪除指定的單條數據

curl -XDELETE http://115.29.229.72:9330/logstash-2017.01.09/testlog/AVmB7OKdWXPobNRX0V5m

 

 

刪除整個索引(嘗試刪除某一個類型應該是不支持)

curl -XDELETE http://115.29.229.72:9330/logstash-2017.01.09  or   curl -XDELETE http://115.29.229.72:9330/logstash-2017.01.* (支持通配符)

  

 

更新

更新有兩種方法,意識全量提交,指明_id才發一次請求

1
2
3
4
5
6
# curl -XPOST http://127.0.0.1:9200/logstash-2015.06.21/testlog/
AU4ew3h2nBE6n0qcyVJK -d '{
     "date"  "1434966686000" ,
     "user"  "chenlin7" ,
     "mesg"  " " first message into Elasticsearch but version 2"
}'

 

 

另外一個是局部更新使用/_update接口

指定doc 添加或修改字段

1
curl -XPOST  'http://127.0.0.1:9330/logstash-2017.01.09/testlog/AVmB92lCWXPobNRX0V5v/_update'  -d  '{"doc":{"age":"18"}}'

 

指定script(文檔中操做是這樣。沒有試過)

# curl -XPOST 'http://127.0.0.1:9200/logstash-2015.06.21/testlog
/AU4ew3h2nBE6n0qcyVJK/_update' -d '{
    "script" : "ctx._source.user = \"someone\""
}'

 

搜索請求

全文搜索:ES的搜索請求,有簡易語法和完整語法兩種

簡易語法做爲之後在kibana上最經常使用的方式。

1
curl -XGET http: //115 .29.229.72:9330 /logstash-2017 .01.09 /testlog1/_search \?q\=first

這樣就獲取到了logstash-2017.01.09索引中的testlog1類型中first關鍵字的全部數據

複製代碼
{"took":4,"timed_out":false,"_shards":{
    
    "total":5,"successful":5,"failed":0
  
    },

  "hits":{
    
    "total":1,"max_score":0.30685282,
  
    "hits":[{
    
      "_index":"logstash-2017.01.09",
  
      "_type":"testlog1","_id":"AVmB90IfWXPobNRX0V5u",

      "_score":0.30685282,"_source":{

          "date":"123456",

          "user":"chenlin7",

          "mesg":"first mesasge"}
        }]
    }
}
複製代碼

 

還可使用

1
curl -XGET http: //115 .29.229.72:9330 /logstash-2017 .01.09 /testlog/_search \?q\=user: "chenlin7"

 

或者知道某個字段必定在那個key中:例子中就是 first必定是在mesg中

1
curl -XGET http: //115 .29.229.72:9330 /logstash-2017 .01.09 /testlog/_search \?q\=mesg:first

  

  

 

node2安裝好之後配置集羣模式

1
2
3
4
[root@node1 src] # scp /etc/elasticsearch/elasticsearch.yml 192.168.56.12:/etc/elasticsearch/elasticsearch.yml
[root@node2 elasticsearch] # sed -i '23s#node.name: linux-node1#node.name: linux-node2#g' elasticsearch.yml
[root@node2 elasticsearch] # mkdir -p /data/es-data
[root@node2 elasticsearch] # chown elasticsearch.elasticsearch /data/es-data/

 

node1與node2中都配置上(單播模式,據說還有組播默認,能夠嘗試一下)

1
2
3
[root@linux-node1 ~] # grep -n "^discovery" /etc/elasticsearch/elasticsearch.yml
79:discovery.zen. ping .unicast.hosts: [ "linux-node1" "linux-node2" ]
[root@linux-node1 ~] # systemctl restart elasticsearch.service

  在瀏覽器中查看分片信息,一個索引默認被分紅了5個分片,每份數據被分紅了五個分片(能夠調節分片數量),下圖中外圍帶綠色框的爲主分片,不帶框的爲副本分片,主分片丟失,副本分片會複製一份成爲主分片,起到了高可用的做用,主副分片也可使用負載均衡加快查詢速度,可是若是主副本分片都丟失,則索引就是完全丟失。 

 

安裝使用kopf插件,監控elasticsearch(elasticsearch服務器都安裝)

1
[root@linux-node1 bin] # /usr/share/elasticsearch/bin/plugin install lmenezes/elasticsearch-kopf

重啓es服務,訪問,沒有意外你就能看到這個界面

 

還有什麼別的用暫時還不知道

 

安裝logstatsh

下載並安裝GPG key

 

1
[root@linux-node2 ~] # rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch

 

添加yum倉庫

1
2
3
4
5
6
7
[root@linux-node2 ~] # vim /etc/yum.repos.d/logstash.repo
[logstash-2.1]
name=Logstash repository  for  2.1.x packages
baseurl=http: //packages .elastic.co /logstash/2 .1 /centos
gpgcheck=1
gpgkey=http: //packages .elastic.co /GPG-KEY-elasticsearch
enabled=1

安裝logstash

1
[root@linux-node2 ~] # yum install -y logstash
  • 也能夠下載logstash的tar包解壓便可使用

安裝後就能夠測試了

logstatsh有兩種啓動方式,一種用就是測試啓動,一種就是正式啓動

logstash工做方式:logstatsh的功能是收集日誌文件,並將收集的日誌文件發送給es服務器。而後es服務器產生索引,提供搜索,而且再交給web展現

可是日誌類型和索引名稱都是在logstatsh中定義的

 

a、首先咱們熟悉logstatsh的格式是以jason爲格式,其中定義輸入輸出

 

1
‘input { stdin{} } output { stdout{} }’

input :輸入,output :輸出

input能夠是命令行手動輸入,也能夠是指定一個文件,或者一個服務,  

output是輸出位置。能夠是屏幕打印,也能夠指定es服務器

  • 咱們先作一個最基礎的命令行輸入,和屏幕輸出
1
2
3
4
5
6
[root@node2 bin] # /opt/logstash/bin/logstash -e 'input { stdin{} } output { stdout{} }'   <br>#stdin 指定輸入爲stdin標準輸入   output:指定stdout標準輸出<br><br>Settings: Default filter workers: 1
Logstash startup completed
<br>chuck  --> 命令行輸入
2016-01-14T06:01:07.184Z node2 chuck  ==>屏幕輸出
<br>www.chuck-blog.com  --> 命令行輸入
2016-01-14T06:01:18.581Z node2 www.chuck-blog.com  ==>屏幕輸出
  • 使用rubudebug顯示詳細輸出,codec爲一種編解碼器
1
2
3
4
5
6
7
8
9
10
[root@node2 bin] # /opt/logstash/bin/logstash -e 'input { stdin{} } output { stdout{ codec => rubydebug} }'  #codec 指定輸出的解碼器,不知道還有沒有別的解碼器
Settings: Default filter workers: 1
Logstash startup completed
chuck   ---> 屏幕輸入
{
        "message"  =>  "chuck" ,
       "@version"  =>  "1" ,
     "@timestamp"  =>  "2016-01-14T06:07:50.117Z" ,
           "host"  =>  "node2"
}   --->rubydebug格式輸出

上述每一條輸出的內容稱爲一個事件,多個相同的輸出的內容合併到一塊兒稱爲一個事件(舉例:日誌中連續相同的日誌輸出稱爲一個事件)!  

 

** Logstash 會給時間添加一些額外信息,最重要的就是@timestamp,用來標記時間的發生時間。由於這個字段涉及到Logs他說的內部流傳,因此必須是一個joda對象,若是你嘗試本身給一個字符串

字段命名爲@timestamp,Logstash會直接報錯。因此,青絲用filter/data插件來管理這個特殊字段

此外大多數時候,還能夠見到另外幾個。

1
2
3
4
5
一、host標記時間發生在哪裏
 
二、 type 標記時間的惟一類型
 
三、tags標記時間的某方面屬性。這是一個數組,一個時間能夠有多個標籤。

 

複製代碼
Logstash 格式及支持的數據類型:
Logstash 格式被命名爲區段(section)
section的格式是:
input{
  stdin{
  }
  syslog{
  }
}

數據類型
  • bool

    debug => true

  • string

    host => "hostname"

  • number

    ip => 127.0.0.1

  • array

    match => ["datetime","Unix"]

  • hash

    options => {

      key1 = > "value1",

      key2 => "value2"

    }

** 若是版本低於1.2.0 hash的寫法和array是同樣的

 

 

複製代碼

 

字段:

 

 

 

 

 

  • 使用logstash將信息寫入到elasticsearch
1
[root@linux-node2 bin] # /opt/logstash/bin/logstash -e 'input { stdin{} } output { elasticsearch { hosts => ["192.168.1.105:9200"] } }'
1
2
3
4
5
6
7
#這裏定義的output 就是指定es服務器的地址以及端口,也能夠直接寫hostname
Settings: Default filter workers: 1
Logstash startup completed
maliang
chuck
www.google.com
www.baidu.com

也能夠本地輸出,和遠程發送同時進行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@-node2 bin] # /opt/logstash/bin/logstash -e 'input { stdin{} } output { elasticsearch { hosts => ["192.168.1.105:9200"] } stdout{ codec => rubydebug } }'
Settings: Default filter workers: 1
Logstash startup completed
www.google.com
{
        "message"  =>  "www.google.com" ,
       "@version"  =>  "1" ,
     "@timestamp"  =>  "2016-01-14T06:27:49.014Z" ,
           "host"  =>  "node2"
}
www.elastic.com 
{
        "message"  =>  "www.elastic.com" ,
       "@version"  =>  "1" ,
     "@timestamp"  =>  "2016-01-14T06:27:58.058Z" ,
           "host"  =>  "node2"
}

  

 

  • 使用logstatsh讀取一個配置文件,把寫好的規則放在文件中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@node2 ~] # cat test.conf
input { stdin { } }
output {
   elasticsearch { hosts => [ "192.168.31.105:9200" ] }    #發送
   stdout { codec => rubydebug }                #而且顯示
}
<br><strong>[root@linux-node1 ~] # /opt/logstash/bin/logstash -f test.conf</strong><br>
Settings: Default filter workers: 1
Logstash startup completed
123
<br>{
        "message"  =>  "123" ,
       "@version"  =>  "1" ,
     "@timestamp"  =>  "2016-01-14T06:51:13.411Z" ,
           "host"  => "lnode1

若是你是yum安裝,就能夠把這個位置文件放在 /etc/logstash/conf.d/ 下面 直接啓動logstatsh 就直接發送給es服務器了

 

b、學習編寫conf格式

  • 輸入插件配置,此處以file爲例,能夠設置多個
1
2
3
4
5
6
7
8
9
10
input {
   file  {
     path =>  "/var/log/messages"
     type  =>  "syslog"   #類型
   }
   file  {
     path =>  "/var/log/apache/access.log"
     type  =>  "apache"   #類型
   }
}  
  • 介紹幾種收集文件的方式,可使用數組方式或者用*匹配,也能夠寫多個path
1
2
path => [ "/var/log/messages" , "/var/log/*.log" ]
path => [ "/data/mysql/mysql.log" ]
  • 設置boolean值
1
ssl_enable =>  true
  • 文件大小單位
1
2
3
4
my_bytes =>  "1113"    # 1113 bytes
my_bytes =>  "10MiB"   # 10485760 bytes
my_bytes =>  "100kib"  # 102400 bytes
my_bytes =>  "180 mb"  # 180000000 bytes
  • jason收集 
1
codec => 「json」
  • hash收集 
1
2
3
4
5
match => {
   "field1"  =>  "value1"
   "field2"  =>  "value2"
   ...
}
  • 端口
1
port =>  33
  • 密碼
1
my_password =>   "password"

 

c、學習編寫input的file插件

  

sincedb_path:記錄logstash讀取位置的路徑 
start_postion :包括beginning和end,指定收集的位置,默認是end,從尾部開始 
add_field 加一個域 
discover_internal 發現間隔,每隔多久收集一次,默認15秒

 

d、學習編寫output的file插件

 

e、經過input和output插件編寫conf文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@node3 ~] # cat /etc/logstash/conf.d/syslog.conf
input {
     file  {
         path =>  "/var/log/my_syslog"    #日誌地址
         type  =>  "syslog"           #自定義類型
     start_position =>  "beginning"   #從頭開始讀取日誌 
     }
}
output {
     elasticsearch {             #輸出推送給es服務器  
         hosts => [ "node2.gitlab.com" ]       #es服務器地址
         index =>  "system-%{+YYYY.MM.dd}"    #自定義索引  
     }
}
  • 咱們不是配置了兩臺es嗎,怎麼就發給一個呢?是由於es服務器自己支持集羣分片,當數據到達es服務器的時候,es服務器本身會將日誌信息分散到全部其餘的服務器上。
  • 而後咱們就可以在頁面上看到了

  兩臺服務器,而後每臺服務分紅了5份,在瀏覽器中查看分片信息,一個索引默認被分紅了5個分片,每份數據被分紅了五個分片(能夠調節分片數量),下圖中外圍帶綠色框的爲主分片,不帶框的爲副本分片,主分片丟失,副本分片會複製一份成爲主分片,起到了高可用的做用,主副分片也可使用負載均衡加快查詢速度,可是若是主副本分片都丟失,則索引就是完全丟失。 

 

 f、使用type來匹配類型

**start_position 僅在文件未被監控過的時候起做用,若是sincedb文件中已經有監控文件的inode記錄了,那麼Logstash依然會從記錄過的pos開始讀取。因此重複測試的時候每次須要刪除sincedb文件。不過有一個巧妙的方法

就是把sincedb文件的位置定義在/dev/null中,這樣每次重啓自動從開頭讀取

 

 

g、把多行整個報錯收集到一個事件中

以at.org開頭的內容都屬於同一個事件,可是顯示在不一樣行,這樣的日誌格式看起來很不方便,因此須要把他們合併到一個事件中

引入codec的multiline插件

官方文檔提供

1
2
3
4
5
6
7
8
9
input {
   stdin {
     codec => multiline {
  `     pattern =>  "pattern, a regexp"
       negate =>  "true"  or  "false"
       what =>  "previous"  or  "next" `
     }
   }
}

regrxp:使用正則,什麼狀況下把多行合併起來 
negate:正向匹配和反向匹配 
what:合併到當前行仍是下一行 
在標準輸入和標準輸出中測試以證實多行收集到一個日誌成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[root@linux-node1 ~] # cat muliline.conf
input {
     stdin {
         codec => multiline {
             pattern =>  "^\["
             negate =>  true
             what =>  "previous"
         }
     }
}
output {
     stdout {
         codec =>  "rubydebug"
     }
}
[root@linux-node1 ~] # /opt/logstash/bin/logstash -f muliline.conf
Settings: Default filter workers: 1
Logstash startup completed
[1
[2
{
     "@timestamp"  =>  "2016-01-15T06:46:10.712Z" ,
        "message"  =>  "[1" ,
       "@version"  =>  "1" ,
           "host"  =>  "linux-node1"
}
chuck
chuck-blog.com
123456
[3
{
     "@timestamp"  =>  "2016-01-15T06:46:16.306Z" ,
        "message"  =>  "[2\nchuck\nchuck-bloh\nchuck-blog.com\n123456" ,
       "@version"  =>  "1" ,
           "tags"  => [
         [0]  "multiline"
     ],
           "host"  =>  "linux-node1"

繼續將上述實驗結果放到all.conf的es-error索引中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[root@linux-node1 ~] # cat all.conf
input {
     file  {
         path =>  "/var/log/messages"
         type  =>  "system"
         start_position =>  "beginning"
     }
     file  {
         path =>  "/var/log/elasticsearch/chuck-clueser.log"
         type  =>  "es-error"
         start_position =>  "beginning"
         codec => multiline {
             pattern =>  "^\["
             negate =>  true
             what =>  "previous"
         }
     }
}
output {
     if  [ type ] ==  "system"  {
         elasticsearch {
             hosts => [ "192.168.56.11:9200" ]
             index =>  "system-%{+YYYY.MM.dd}"
         }
     }
     if  [ type ] ==  "es-error"  {
         elasticsearch {
             hosts => [ "192.168.56.11:9200" ]
             index =>  "es-error-%{+YYYY.MM.dd}"
         }
     }
}

 

Logstash 使用一個名叫FileWatch 的Ruby Gem 庫來監聽文件變化。這個庫支持glob展開文件路徑,而且會記錄一個叫.sincedb的數據庫文件來跟蹤被堅挺的日誌文件的當前讀取位置。

sincedb文件中記錄了每一個被堅挺的文件的 inode,major number, minor number 和 pos

  

h. 使用log4j插件收集tomcat日誌

首先在tomcat的log4j配置文件中進行修改,讓日誌輸出到一個地方,而後使用Logstash去這個地方收集

這個地方就是一個ip+port

通常tomat中log4j的配置有兩種形式,一種是log4j.properties 另外一種是log4j.xml 文件位置:

第一種:

1
webapps /ROOT/WEB-INF/classes/log4j .properties
  log4j.properties

 

複製代碼
input {
    log4j {
        type => "testapi3"      #日誌類型
        host => "127.0.0.1"    #接受的地址
        port => 4990              #接受的端口
        }
}

output {
    stdout{
        codec => rubydebug
    }
}    
複製代碼

 

其餘參數

add_field :添加一個字段到時間中

類型 hash

默認爲空 {}

 

codec:輸入時的字符編碼

默認爲"plain"

 

 data_timeout  : 超時時間

默認值爲5

讀超時秒。若是一個特定的TCP鏈接空閒時間超過這個超時週期,就認爲這個任務死了,並不在監聽。若是你不想超時,用-1。

 

host: 監聽地址

默認: 0.0.0.0

如實是服務器的話,就監聽這個。若是是客戶端則鏈接這個地址

 

mode:設置是服務器仍是客戶端(server|client)

默認 server

模式切換:服務器監聽客戶端的鏈接,客戶端發送到服務器

 

tags

類型:array

沒有設置默認值

添加任意數量的任意標籤的事件。這能夠幫助處理。

處理結果樣式圖:

 

 

 

 

kibana的配置

1
2
3
4
5
[root@node2 logs] # grep '^[a-Z]' /opt/svr/kibana/config/kibana.yml
server.port: 5601
server.host:  "0.0.0.0"
elasticsearch.url:  "http://localhost:9200"
kibana.index:  ".kibana"

啓動

1
2
[root@node2 kibana] # nohup ./bin/kibana  &
[1] 6722

 

1
2
[root@node2 kibana] # ss -tunlp | grep 5601
tcp    LISTEN     0      128                    *:5601                  *:*       users :(( "node" ,6722,11))

 

在kibana中添加一個elklog索引

點擊create 建立

kibana經過elklog的索引去es服務器上搜索有關日誌

 

 

 

點擊discover便可查看到圖形界面

 

相關文章
相關標籤/搜索