ELK日誌系統淺析與部署

1、ELK應用場景
在複雜的企業應用服務羣中,記錄日誌方式多種多樣,而且不易歸檔以及提供日誌監控的機制。不管是開發人員仍是運維人員都沒法準確的定位服務、服務器上面出現的種種問題,也沒有高效搜索日誌內容從而快速定位問題的方式。所以須要一個集中式、獨立的、蒐集管理各個服務和服務器上的日誌信息,集中管理,並提供良好的UI界面進行數據展現,處理分析。java

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

2、ELK日誌系統介紹
一、ELK分別是Elasticsearch、Logstash、Kibana三個開源框架縮寫。web

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

二、ELK經典應用以下spring

ELK經典架構sql

如圖json

Logstash部署至服務主機,對各個服務的日誌進行採集、過濾、推送。
Elasticsearch存儲Logstash傳送的結構化數據,提供給Kibana。
Kibana提供用戶UIweb頁面進行,數據展現和分析造成圖表等。
備註:logs 泛指,各類日誌文件以及日誌信息:windows,negix,tomcat,webserver等等。windows

三、ELK改進centos

因爲Logstash消耗資源大,而服務器資源至關寶貴,因此引進另外一個輕量級日誌採集框架Beats,其中包含如下6種緩存

Packetbeat    用於蒐集網絡流量數據
Heartbeat

用於運行時間監控
Filebeat    用於蒐集文件數據
Winlogbeat    用於蒐集winodws事件數據
Metricbeat    用於指標
Auditbeat    用於審計數據

改良ELK
四、進一步思考

傳統web項目中,常用log4j以及logback(性能更高)等成熟日誌插件進行日誌的記錄,是否提供更好的解決方案。

ELK升級1.0

如圖

日誌採集新增Logback直接發送日誌到Logstash的形式。若是採用此方式,web服務可減小部分生成log文件配置,提升實時性和日誌推送效率
五、高併發場景

因爲logstash消耗性能,因此高併發場景容易遇到流量上的瓶頸,及時使用logstash集羣也是如此,因此能夠添加中間件進行日誌緩存處理。因爲logstash數據源具備多種方式,全部中間件也能夠不少選擇,常見的有kafka,redis。

ELK升級2.0

如圖

host一、中間件、host2 均爲高可用服務集羣   爲簡單顯示未畫出
logback出現的業務數據能夠經過寫入redis或者kafka等中間件進行緩存,再經過合理限制流量閥值輸送至logstash進行過濾
beats 若是是filebeat其日誌若無實時性要求,能夠經過控制log文件更新速度限制Beats傳輸日誌流量

三 ELK搭建(非集羣)
一、下載ELK(保持版本一致)!

Elasticsearch    官網elasticsearch-6.3.0.tar    elasticsearch官方文檔
Kibana    官網kibana-6.3.0下載 linux64位    kibana官方文檔
Logstash    官網logstash-6.3.0.tar    logstash官方文檔
Filebeat    官網filebeat-6.3.0 linux64位    beats官方文檔
備註:演示爲centos7 即linux版本,請按實際需求更改

經過rz命令上傳至centos7虛擬機


二、解壓

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目錄下
三、java環境搭建

推薦使用jdk1.8jdk環境配置

四、安裝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啓動常見問題

驗證elasticsearch啓動

五、安裝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啓動

六、安裝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官方輸入源支持以及下載

安裝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日誌數據

使用時間戳顯示 單位時間線程記錄日誌數量

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

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

三、沒有完美的架構,只有合適的用法,針對不一樣的業務環境須要對架構進行微調,總體思路不變。elk爲單獨高可用服務羣,服務器羣與beats或者logback亦是獨立高可用。

四、根據業務須要,在logback打印的日誌中能夠進行結構化處理,亦或者在logstash的filter中對數據進行結構化處理。業務場景有待考究,初步考慮異常分析以及sql回滾等。 ---------------------  做者:Mars_Bug  來源:CSDN  原文:https://blog.csdn.net/qq_22211217/article/details/80764568  版權聲明:本文爲博主原創文章,轉載請附上博文連接!

相關文章
相關標籤/搜索