什麼是ELK呢?
ELK是三個元件的縮寫, 分别是elasticsearch, logstash, kibana. ELK平台可以用于實作日志收集、日志搜尋和日志分析
1.elasticsearch(es): 它是個開源分布式搜尋引擎,它的特點有:分布式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多資料源,自動搜尋負載等。
2.logstash: 簡單說是一個日志收集工具, 可以定義從哪裡擷取資料, 并且可以簡單處理資料, 最後可以定義将資料輸出到哪裡, 一般輸出到es.
3.kibana: 其實就是一個資料展示界面, 并且可以分析資料, 例如從es中讀取資料進行展示分析. es自己也帶有簡單的展示dashboard: http://127.0.0.1:9200/_plugin/head/, 當然 前提是你安裝了head插件
如何搭建一個ELK日志分析平台呢?
一.單機安裝elasticsearch
1.利用安裝elasticsearch的rpm包安裝
yum install elasticsearch-..rpm
2.配置elasticsearch的配置檔案
cd /etc/elasticsearch/
vim elasticsearch.yml # 主配置檔案
cluster.name: my-es # 叢集的名稱my-es
node.name: server1 # 目前節點的主機名
path.data: /var/lib/elasticsearch/ # 資料目錄
path.logs: /var/log/elasticsearch/ # 日志目錄
network.host: # 目前主機的IP
http.port: # 對外端口号
3.安裝java環境(因為Elasticsearch是用Java開發的)
rpm -ivh jdk-u121-linux-x64.rpm
4.啟動elasticsearch服務
打開服務後可以在浏覽器中輸入目前主機的IP和端口号檢視(隻有簡單的資料,沒有圖形界面也沒有分析等,是以我們選擇安裝相應圖形界面的插件,友善分析處理資料)
5.安裝插件:
cd /usr/share/elasticsearch/
cd /bin
./plugin list # 檢視已經安裝的插件
/usr/share/elasticsearch/bin/plugin install file:/root/elk/elasticsearch-head-master.zip
6.安裝插件以後,我們在浏覽器中檢視,得到的就是比較便于觀察和分析的web界面
7.在該web界面下建立索引嘗試查詢
二 . 叢集Elasticsearch的安裝和配置
Elasticsearch是一個開源的高擴充的分布式全文檢索引擎,它可以近乎實時的存儲、檢索資料;本身擴充性很好,可以擴充到上百台伺服器,處理PB級别的資料。
ES可以作為一個獨立的單個搜尋伺服器。不過,為了處理大型資料集,實作容錯和高可用性,ES可以運作在許多互相合作的伺服器上。這些伺服器的集合稱為叢集。
1.在server2和server3上安裝elasticsearch-2.3.3.rpm和jdk-8u121-linux-x64.rpm
rpm -ivh jdk-u121-linux-x64.rpm
yum install elasticsearch-.rpm
2.編輯sevre1上的配置檔案elasticsearch.yml
行 discovery.zen.ping.unicast.hosts: ["server1", "server2","server3"]
# 表示該叢集由三台主機構成,主機名分别是server1,server2和server3
将修改好的配置檔案發送給server2和server3上,在server2上和server3上修改配置檔案中的sevrername和ip
3.啟動server2和sevrer3上的服務
/etc/init.d/elasticsearch start
4.為了将叢集中三台主機所負責的功能子產品分開,我們在配置檔案中設定:
server1:
#server1是主節點,同時承擔http查詢任務
vim elasticsearch.yml
node.name: server1
node.master: true
node.data: false
http.enabled: true
server2:
# server2負責存儲資料和http查詢任務
vim elasticsearch.yml
node.name: server2
node.master: false
node.data: true
http.enabled: true
server3:
# server3和server2相同
vim elasticsearch.yml
node.name: server2
node.master: false
node.data: true
http.enabled: true
5.重新開機所有節點上的服務,在浏覽器中檢視web界面
6.查詢叢集的狀态
資料查詢(三個節點上的node.data均為true)
curl /_nodes/_local
删除demo索引
三.logstash的安裝與配置
Logstash是開源的伺服器端資料處理管道,能夠同時從多個來源采集資料,轉換資料,然後将資料發送到您喜歡的“存儲庫”中。(我們的存儲當然是Elasticsearch。)
1.安裝logstash工具
添加不同的子產品:
1.标準終端輸入stdin和輸出stdout子產品
/opt/logstash/bin/logstash -e 'input { stdin { } } output { stdout { } }'
# input輸入是從終端标準輸出
Settings: Default pipeline workers:
Pipeline main started
hello # 标準輸入hello
-08-T02::Z server1 hello # 标準輸出hello
world
-08-T02::Z server1 world
^CSIGINT received. Shutting down the agent. {:level=>:warn} # ctrl+c中斷
stopping pipeline {:id=>"main"}
Pipeline main has been shutdown
2.在标準終端輸出的時候選擇輸出資料格式codec => rubydebug
/opt/logstash/bin/logstash -e 'input { stdin { } } output { stdout { codec => rubydebug } }'
Settings: Default pipeline workers:
Pipeline main started
hello # 标準輸入
{
"message" => "hello", # 輸出
"@version" => "1",
"@timestamp" => "2018-08-25T02:38:09.060Z",
"host" => "server1"
}
world
{
"message" => "world",
"@version" => "1",
"@timestamp" => "2018-08-25T02:38:12.447Z",
"host" => "server1"
}
^CSIGINT received. Shutting down the agent. {:level=>:warn}
stopping pipeline {:id=>"main"}
Pipeline main has been shutdown
3.标準終端輸出,輸出到提供elasticsearch的主機(server1)中
/opt/logstash/bin/logstash -e 'input { stdin { } } output { elasticsearch { hosts => ["172.25.1.1"] index => "logstash-%{+YYYY.MM.dd}" } }'
Settings: Default pipeline workers:
Pipeline main started
hello
hello world
hello jay # 無終端輸出,是因為将資料輸出到了elasticsearch中
^CSIGINT received. Shutting down the agent. {:level=>:warn}
stopping pipeline {:id=>"main"}
Pipeline main has been shutdown
在浏覽器中檢視:
4.上邊幾種情況的集合,标準終端輸入,輸出分為兩部分,一部分輸出到elasticsearch ,另一種是輸出到終端…
/opt/logstash/bin/logstash -e 'input { stdin { } } output { elasticsearch { hosts => ["172.25.1.1"] index => "logstash-%{+YYYY.MM.dd}" } stdout { codec => rubydebug } }'
Settings: Default pipeline workers:
Pipeline main started
hello world
{
"message" => "hello world",
"@version" => "1",
"@timestamp" => "2018-08-25T02:42:38.615Z",
"host" => "server1"
}
hello linux
{
"message" => "hello linux",
"@version" => "1",
"@timestamp" => "2018-08-25T02:42:42.556Z",
"host" => "server1"
}
^CSIGINT received. Shutting down the agent. {:level=>:warn}
stopping pipeline {:id=>"main"}
Pipeline main has been shutdown
5.上邊的各種子產品都是直接在指令行選擇子產品,輸入或者輸出。我們也可以在檔案中編寫使用的子產品,選擇輸入和輸出,
cd /etc/logstash/conf.d/
vim es.conf # 檔案名,可以随意取
input {
stdin {} # 輸入是标準終端輸入standard input
}
output {
elasticsearch { # 第一個輸出是到elasticsearch
hosts => ["172.25.1.1"] # elasticsearch所在的主機
index => "logstash-%{+YYYY.MM.dd}"
}
stdout { # 第二個輸出是标準終端輸出
codec => rubydebug # 輸出的風格是rubydebug
}
}
在終端的運作情況:
/opt/logstash/bin/logstash -f /etc/logstash/conf.d/es.conf # 在終端利用logstash運作此檔案
Settings: Default pipeline workers:
Pipeline main started
hello qzy # 标準終端輸入
{
"message" => "hello qzy", # 輸出的一部分,在終端标準輸出
"@version" => "1",
"@timestamp" => "2018-08-25T02:46:38.949Z",
"host" => "server1"
}
hello jay
{
"message" => "hello jay",
"@version" => "1",
"@timestamp" => "2018-08-25T02:46:43.771Z",
"host" => "server1"
}
nice to meet you
{
"message" => "nice to meet you",
"@version" => "1",
"@timestamp" => "2018-08-25T02:46:58.730Z",
"host" => "server1"
}
^CSIGINT received. Shutting down the agent. {:level=>:warn}
stopping pipeline {:id=>"main"}
Pipeline main has been shutdown
在浏覽器中的資料輸出:
6.rsyslog子產品:
将server1當作一個日志收集伺服器
(1).編輯一個使用子產品的檔案
vim message.conf
input {
syslog {
port => # 輸入是server2的日志,同步日志端口為/udp
}
}
output {
# elasticsearch {
# hosts => ["172.25.1.1"] # 輸出到server1的elasticsearch
# index => "message-%{+YYYY.MM.dd}"
# }
stdout {
codec => rubydebug # 輸出到标準螢幕輸出
}
}
(2).在sevrer2中編輯同步日志的檔案
vim /etc/rsyslog.conf
*.* @@172:
/etc/init.d/rsyslog restart # 重新打開rsyslog服務
(3).檢視rsyslog的端口和運作該模式的結果
在server1上netstat -antulp | grep 514
在server1以終端占用的方式執行
/opt/logstash/bin/logstash -f /etc/logstash/conf.d/message.conf
在server1上可以收集到server2上的日志資訊
(4).在server上執行logger tigger,在server1上立即可以看到trigger的輸出
7.利用logstash中的子產品将日志記錄中的多行輸出變為一行:
(1).在elasticsearch的日志記錄檔案中
cd /var/log/elasticsearch
cat my-es.log
看到以[]為界線的日志有時候并不在一行
(2).利用filter對輸入進行過濾處理再指定輸出
vim /etc/logstash/conf.d/message.conf
input {
file {
path => "/var/log/elasticsearch/my-es.log" # 待處理日志所在位置
start_position => "beginning" # 從日志的開始處處理
}
}
filter {
multiline {
pattern => "^\["
negate => true
what => "previous"
}
}
output {
elasticsearch {
hosts => ["172.25.1.1"]
index => "es-%{+YYYY.MM.dd}"
}
stdout {
codec => rubydebug
}
}
(3).在終端執行操作
/opt/logstash/bin/logstash -f /etc/logstash/conf.d/message.conf
# 因為在終端出有大量的java日志,是以就不再展示
-
這裡有一個需要注意的點:我們在message.conf中寫的是從日志檔案的beginning開始,但是,此時我們接着往日志中寫東西,我們發現是從上次結束的地方開始,看起來好像與我們的設定出現差異,但是不然,如果又從頭開始記錄,必然會造成資訊的重複。
在linux中,我們有檔案專門記錄日志的編号:
cat /root/.sincedb_452905a167cf4509fd08acb964fdb20c
913943 0 64768 32581
ls -i /var/log/messages
913943 /var/log/messages
這兩個數字是一樣的,最後一個日志表示此時日志的位置為32581,當我們在日志中接着寫點東西的時候,該數字會發生變化,即表示下次記錄的時候從此位置開始
logger cat
cat .sincedb_452905a167cf4509fd08acb964fdb20c (該檔案不發生變更,是不會重複讀的)
913943 0 64768 32751
9.利用filter使httpd的日志按照規定格式輸出:
1.編輯一個處理httpd日志的檔案test.conf
vim test.conf
input {
stdin {} # 輸入是終端标準輸入
}
filter {
grok {
match => { "message" => "%IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
# 利用filter對輸入的資料進行過濾,轉換為指定格式指定
}
}
output {
stdout {
codec => rubydebug # 标準終端輸出
}
}
在終端中
/opt/logstash/bin/logstash -f /etc/logstash/conf.d/test.conf
GET /index.html # 标準輸入
2.引用系統中的變量對httpd服務的輸出日志進行處理,按照指定格式輸出
vim message.conf
input {
file {
path => ["/var/log/httpd/access_log","/var/log/httpd/error_log"] # 日志檔案所在的位置
start_position => "beginning" # 開始同步的位置=>檔案開始處
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
# 引用變量COMBINEDAPACHELOG
}
}
output {
elasticsearch {
hosts => ["172.25.1.1"]
index => "apache-%{+YYYY.MM.dd}"
}
stdout {
codec => rubydebug
}
}
3.在httpd的預設釋出目錄寫預設釋出檔案,在主配置檔案中可以看到預設的日志輸出格式
引用變量的位置在
/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-2.0.5/patterns/
vim grok-patterns
在終端執行輸出:
四.在server3上安裝kibana
Kibana是一個開源的分析與可視化平台,設計出來用于和Elasticsearch一起使用的
1.安裝rpm包
2.編輯其主配置檔案,寫
cd /opt/kibana/config/
vim kibana.yml
3.打開服務并檢視端倪口
/etc/init.d/kibana start
netstat -antlp
五.ELK日志分析工具之間的解耦
思路:從nginx的日志檔案中得到資料放在logstash中,由logstash将資料存在redis中,再由logstash将資料從redis中拿出來交給kibana,這樣下來,資料經過redis,保證了資料的安全性也使得logstash和kibana之間得資料不是直接關聯,降低了耦合性。
(一).基本服務的配置
1.在server1上安裝nginx
2.在server2上安裝redis
tar zxf redis-.tar.gz
cd redis-
make # 來一波簡單的源碼編譯
make install
3.打開redis
cd /root/redis-./src/utils/
./install_server.sh
檢視redis的端口netstat -antlp
(二).nginx的安裝
1.在server1上安裝nginx
2.檢視nginx的日志格式,nginx的配置檔案
cd /etc/nginx/
vim nginx.conf
3.引用apache的日志格式變量
cd /opt/logstash/vendor/bundle/jruby//gems/logstash-patterns-core-/patterns/
vim grok-patterns
4.編輯nginx.conf來對nginx的日志做處理
vim nginx.conf
input {
file {
path => "/var/log/nginx/access.log" # nginx的日志
start_position => "beginning"
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG} %{QS:x_forwarded_for}" } # 在apache日志的前提下再加上自己的日志輸出
}
}
output {
redis {
host => ["172.25.1.2"]
port => # 輸出到server2的redis端口
data_type => "list" # 在redis中以清單形式存儲
key => "logstash:redis" # 定義清單形式的鍵值對
}
stdout {
codec => rubydebug
}
}
修改nginx的日志權限
5.在終端執行處理nginx日志的檔案
6.在實體機進行壓測ab -c 1 -n 10 http://172.25.1.1/index.html在server1上看日志輸出
(三).在server2上安裝noarch
rpm -ivh logstash--noarch.rpm
cd /etc/logstash/conf.d/
vim es.conf
input {
redis { # 從redis中拿資料
host => "172.25.1.2"
port =>
data_type => "list"
key => "logstash:redis" # 格式和上邊的保持一緻
}
}
output {
elasticsearch { # 輸出是将資料輸出到elasticsearch中
hosts => ["172.25.1.1"]
index => "nginx-%{+YYYY.MM.dd}"
}
}
/opt/logstash/bin/logstash -f /etc/logstash/conf.d/es.conf
在網頁中重新整理,出現nginx
(四).在server3上配置kibana對獲得的資料進行分析
選擇要建立視圖的項目:
建立反映資訊的試圖:
建立聯系人或者時間(根據需要選擇)
将建立的視圖添加到視圖框中:
根據自己的需要添加相應的子產品來對資料進行分析,最終展現出來: