節點能夠經過指定集羣名字來加入到集羣中。默認狀況下,每一個節點被設置成加入到elasticsearch集羣。若是啓動了多個節點,假設能自動發現對方,他們將會自動組建一個名爲 elasticsearch的集羣。php
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的文檔
一、下載tar包直接解壓(靈活)
二、配置yum源直接安裝(方便)
服務器部署:
logstatsh : 部署在想收集日誌的服務器上。
elasticsearch:主要是用於數據收集,索引,搜索提供展現,隨意安裝在那臺服務器上均可以,重要的是es支持分佈式,並且再大規模的日誌分析中必須作分佈式集羣。這樣能夠跨節點索引和搜索。提升吞吐量與計算能力。
kibana:數據展現,部署在任意服務器上。
這裏咱們作實驗使用的是兩臺服務器
1
2
|
node1.wawa.com : 192.168.31.179
node2.wawa.com : 192.168.31.205
|
配置hosts兩臺服務器網絡通暢
node1 安裝es,node2安裝es 作成集羣,後期可能還會用到redis,redis提供的功能至關於kafka,收集logstatsh發來的數據,es從redis中提取數據。
node1 安裝kibana 作數據展現
node2 安裝logstatsh 作數據收集
建立 elasticsearch 用戶
因爲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
安裝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/
|
[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地址,最好是內網。
交互方式:
一、咱們使用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插件顯示索引和分片狀況
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個分片,每份數據被分紅了五個分片(能夠調節分片數量),下圖中外圍帶綠色框的爲主分片,不帶框的爲副本分片,主分片丟失,副本分片會複製一份成爲主分片,起到了高可用的做用,主副分片也可使用負載均衡加快查詢速度,可是若是主副本分片都丟失,則索引就是完全丟失。
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
|
安裝後就能夠測試了
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 ==>屏幕輸出
|
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{
}
}
數據類型
debug => true
host => "hostname"
ip => 127.0.0.1
match => ["datetime","Unix"]
options => {
key1 = > "value1",
key2 => "value2"
}
** 若是版本低於1.2.0 hash的寫法和array是同樣的
字段:
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"
}
|
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格式
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"
#類型
}
}
|
1
2
|
path => [
"/var/log/messages"
,
"/var/log/*.log"
]
path => [
"/data/mysql/mysql.log"
]
|
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
|
1
|
codec => 「json」
|
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}"
#自定義索引
}
}
|
兩臺服務器,而後每臺服務分紅了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
|
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
沒有設置默認值
添加任意數量的任意標籤的事件。這能夠幫助處理。
處理結果樣式圖:
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便可查看到圖形界面