1. 程式人生 > >ELK日誌系統淺析與部署

ELK日誌系統淺析與部署

一、ELK應用場景

在複雜的企業應用服務群中,記錄日誌方式多種多樣,並且不易歸檔以及提供日誌監控的機制。無論是開發人員還是運維人員都無法準確的定位服務、伺服器上面出現的種種問題,也沒有高效搜尋日誌內容從而快速定位問題的方式。因此需要一個集中式、獨立的、蒐集管理各個服務和伺服器上的日誌資訊,集中管理,並提供良好的UI介面進行資料展示,處理分析。

得此:ELK提供一套開源的解決方案,能高效、簡便的滿足以上場景。

二、ELK日誌系統介紹

1、ELK分別是Elasticsearch、Logstash、Kibana三個開源框架縮寫。

框架簡介作用
Elasticsearch開源分散式搜尋引擎,提供儲存、分析、搜尋功能。特點:分散式、基於reasful風格、支援海量高併發的準實時搜尋場景、穩定、可靠、快速、使用方便等。接收蒐集的海量結構化日誌資料,並提供給kibana查詢分析
Logstash開源日誌蒐集、分析、過濾框架,支援多種資料輸入輸出方式。用於收集日誌,對日誌進行過濾形成結構化資料,並轉發到elasticsearch中
Kibana開源日誌報表系統,對elasticsearch以及logstash有良好的web頁面支援。對elasticsearch提供的資料進行分析展示


2、ELK經典應用如下

ELK經典架構

如圖

Logstash部署至服務主機,對各個服務的日誌進行採集、過濾、推送。
Elasticsearch儲存Logstash傳送的結構化資料,提供給Kibana。
Kibana提供使用者UIweb頁面進行,資料展示和分析形成圖表等。
備註:logs 泛指,各種日誌檔案以及日誌資訊:windows,negix,tomcat,webserver等等。

3、ELK改進

由於Logstash消耗資源大,而伺服器資源相當寶貴,所以引進另一個輕量級日誌採集框架Beats,其中包含以下6種

Packetbeat用於蒐集網路流量資料

Heartbeat

用於執行時間監控
Filebeat用於蒐集檔案資料
Winlogbeat用於蒐集winodws事件資料
Metricbeat用於指標
Auditbeat用於審計資料
改良ELK

4、進一步思考

傳統web專案中,經常使用log4j以及logback(效能更高)等成熟日誌外掛進行日誌的記錄,是否提供更好的解決方案。


ELK升級1.0

如圖

日誌採集新增Logback直接傳送日誌到Logstash的形式。如果採用此方式,web服務可減少部分生成log檔案配置,提高實時性和日誌推送效率

5、高併發場景

由於logstash消耗效能,所以高併發場景容易遇到流量上的瓶頸,及時使用logstash叢集也是如此,所以可以新增中介軟體進行日誌快取處理。由於logstash資料來源具有多種方式,所有中介軟體也可以很多選擇,常見的有kafka,redis。


ELK升級2.0

如圖

host1、中介軟體、host2 均為高可用服務叢集   為簡單顯示未畫出
logback出現的業務資料可以通過寫入redis或者kafka等中介軟體進行快取,再通過合理限制流量閥值輸送至logstash進行過濾
beats 如果是filebeat其日誌若無實時性要求,可以通過控制log檔案更新速度限制Beats傳輸日誌流量

三 ELK搭建(非叢集)

1、下載ELK(保持版本一致)!

備註:演示為centos7 即linux版本,請按實際需求更改

通過rz命令上傳至centos7虛擬機器




2、解壓

tar -zxvf elasticsearch-6.3.0.tar.gz          
tar -zxvf kibana-6.3.0-linux-x86_64.tar.gz
tar -zxvf filebeat-6.3.0-linux-x86_64.tar.gz  
tar -zxvf logstash-6.3.0.tar.gz
備註:tar不支援指定解壓目標目錄 可以通過mv 命令進行遷移。本教程遷移至/home目錄下

3、java環境搭建

4、安裝elasticsearch

修改配置檔案

vi /home/elasticsearch-6.3.0/config/elasticsearch.yml
# ---------------------------------- Network -----------------------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#
network.host: 0.0.0.0           ##伺服器ip 本機
#
# Set a custom port for HTTP:
#
http.port: 9200                 ##服務埠
#
# For more information, consult the network module documentation.
#

啟動elasticsearch

/home/elasticsearch-6.3.0/bin/elasticsearch   #命令窗執行
/home/elasticsearch-6.3.0/bin/elasticsearch  -d  #後臺執行緒執行

關閉elasticsearch

ctrl+c                                   #命令窗關閉
ps -ef | grep elastic                    #後臺執行緒關閉
kill -9 4442                             ##pid 4442為查處執行緒的pid 


驗證elasticsearch啟動


5、安裝kibana

修改配置檔案

vi /home/kibana-6.3.0-linux-x86_64/config/kibana.yml
server.port: 5601       ##服務埠
server.host: "0.0.0.0"  ##伺服器ip  本機

elasticsearch.url: "http://localhost:9200" ##elasticsearch服務地址 與elasticsearch對應
啟動kibana
/home/kibana-6.3.0-linux-x86_64/bin/kibana       #命令窗啟動
nohup ./kibana-6.3.0-linux-x86_64/bin/kibana &   #後臺執行緒啟動

關閉kibana

ctrl+c                                   #命令窗關閉
ps -ef | grep kibana                    #後臺執行緒關閉
kill -9 4525                             ##pid 4525 為查處執行緒的pid 

備註:常見問題多為 端口占用,以及目錄未授權,需要同elasticsearch 使用目錄執行執行的使用者去執行 未配置則為root使用者
驗證kibana啟動

6、安裝logstash

新建配置檔案

vi /home/logstash-6.3.0/config/logback-es.conf
input {
    tcp {  
        port => 9601  
        codec => json_lines         
    }
}
output {
        elasticsearch {
                hosts => "localhost:9200"
        }
        stdout { codec => rubydebug}
}
備註:上述檔案複製時必須去除多餘空格,保持yml檔案規範。


備註:上圖與配置部分一一對應
input {                                ##input 輸入源配置
    tcp {                              ##使用tcp輸入源      官網有詳細文件
        port => 9601                   ##伺服器監聽埠9061 接受日誌  預設ip localhost
        codec => json_lines            ##使用json解析日誌    需要安裝json解析外掛
    }
} 
filter {                              ##資料處理
}                                
output {                               ##output 資料輸出配置
        elasticsearch {                ##使用elasticsearch接收
            hosts => "localhost:9200"  ##叢集地址  多個用,隔開
        }
        stdout { codec => rubydebug}   ##輸出到命令視窗
}

安裝logstash json外掛

/home/logstash-6.3.0/bin/logstash-plugin install logstash-codec-json_lines

啟動logstash

 /home/logstash-6.3.0/bin/logstash -f /home/logstash-6.3.0/config/logback-es.conf         ##命令窗形式
nohup /home/logstash-6.3.0/bin/logstash -f /home/logstash-6.3.0/config/logback-es.conf &  ##後臺執行緒形式

關閉logstash

ctrl+c                                   #命令窗關閉
ps -ef | grep logstash                    #後臺執行緒關閉
kill -9 4617                              ##pid 4617 為查處執行緒的pid 

7 使用logback 傳輸日誌到logstash

建立springboot專案(為了快速使用)


pom檔案依賴

               <dependency>
			<groupId>net.logstash.logback</groupId>
			<artifactId>logstash-logback-encoder</artifactId>
			<version>4.11</version>
		</dependency>

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>
    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>192.168.253.6:9601</destination>     <!--指定logstash ip:監聽埠 tcpAppender  可自己實現如kafka傳輸等-->
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
    </appender>

    <include resource="org/springframework/boot/logging/logback/base.xml"/>      <!--引用springboot預設配置-->

    <root level="INFO">
        <appender-ref ref="LOGSTASH" />                                           <!--使用上述訂閱logstash資料tcp傳輸 -->
        <appender-ref ref="CONSOLE" />                                            <!--使用springboot預設配置 除錯視窗輸出-->
    </root>

</configuration>
SpringbootLogbackApplication.java 測試
package com.zyj;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringbootLogbackApplication {
	private final static Logger logger = LoggerFactory.getLogger(SpringbootLogbackApplication.class);

	public static void main(String[] args) {
		new Thread(()->{
			for (int i=0;i<100;i++){
				logger.info("---test---"+i);
			}
		}).start();

		SpringApplication.run(SpringbootLogbackApplication.class, args);
	}
}

9 驗證ELK

為演示方便,我們簡單展示一下,單位時間執行緒列印某日誌的速度。主要通過kibana過濾出結構化資料,通過以資料的時間戳為x軸,以count統計函式為y軸進行圖表展示。

(1)後臺啟動elasticsearch  kibana logstash 並驗證啟動成功

(2)啟動springboot專案


(3)logstash輸出控制檯記錄  此為預設無過濾器列印logback包裝的全部資訊

(4)kibana日誌顯示

新增elasticsearch日誌資料


使用時間戳顯示 單位時間執行緒記錄日誌數量


四 、思考拓展

1、本文未詳細介紹logback詳細配置,以及自定義日誌傳輸,將後續寫入kafka以及redis方案,log4j亦可以使用elk因效能問題不做深究。

2、本文未詳細介紹elasticsearch,logstash,kibana,beats的詳細使用,僅羅列架構以及初步elk使用。beats常用為filebeat,對已經生成文件的日誌進行傳輸。

3、沒有完美的架構,只有合適的用法,針對不同的業務環境需要對架構進行微調,整體思路不變。elk為單獨高可用服務群,伺服器群與beats或者logback亦是獨立高可用。

4、根據業務需要,在logback列印的日誌中可以進行結構化處理,亦或者在logstash的filter中對資料進行結構化處理。業務場景有待考究,初步考慮異常分析以及sql回滾等。