成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring Cloud 實現分布式實時日志分析采集的三種方案

開發 架構
本文主要介紹了ELK實時日志分析的三種部署架構,以及不同架構所能解決的問題,這三種架構中第二種部署方式是時下最流行也是最常用的部署方式。

ELK 已經成為目前最流行的集中式日志解決方案,它主要是由Beats、Logstash、Elasticsearch、Kibana等組件組成,來共同完成實時日志的收集,存儲,展示等一站式的解決方案。本文將會介紹ELK常見的架構以及相關問題解決。

  1. Filebeat:Filebeat是一款輕量級,占用服務資源非常少的數據收集引擎,它是ELK家族的新成員,可以代替Logstash作為在應用服務器端的日志收集引擎,支持將收集到的數據輸出到Kafka,Redis等隊列。
  2. Logstash:數據收集引擎,相較于Filebeat比較重量級,但它集成了大量的插件,支持豐富的數據源收集,對收集的數據可以過濾,分析,格式化日志格式。
  3. Elasticsearch:分布式數據搜索引擎,基于Apache Lucene實現,可集群,提供數據的集中式存儲,分析,以及強大的數據搜索和聚合功能。
  4. Kibana:數據的可視化平臺,通過該web平臺可以實時的查看 Elasticsearch 中的相關數據,并提供了豐富的圖表統計功能。

ELK常見部署架構

1. Logstash作為日志收集器

這種架構是比較原始的部署架構,在各應用服務器端分別部署一個Logstash組件,作為日志收集器,然后將Logstash收集到的數據過濾、分析、格式化處理后發送至Elasticsearch存儲,最后使用Kibana進行可視化展示。

這種架構不足的是:Logstash比較耗服務器資源,所以會增加應用服務器端的負載壓力。

圖片圖片

2. Filebeat作為日志收集器

該架構與第一種架構唯一不同的是:應用端日志收集器換成了Filebeat,Filebeat輕量,占用服務器資源少,所以使用Filebeat作為應用服務器端的日志收集器,一般Filebeat會配合Logstash一起使用,這種部署方式也是目前最常用的架構。

圖片圖片

3. 引入緩存隊列的部署架構

該架構在第二種架構的基礎上引入了Kafka消息隊列(還可以是其他消息隊列),將Filebeat收集到的數據發送至Kafka,然后在通過Logstasth讀取Kafka中的數據,這種架構主要是解決大數據量下的日志收集方案,使用緩存隊列主要是解決數據安全與均衡Logstash與Elasticsearch負載壓力。

圖片圖片

4. 以上三種架構的總結

第一種部署架構由于資源占用問題,現已很少使用,目前使用最多的是第二種部署架構,至于第三種部署架構個人覺得沒有必要引入消息隊列,除非有其他需求,因為在數據量較大的情況下,Filebeat 使用壓力敏感協議向 Logstash 或 Elasticsearch 發送數據。

如果 Logstash 正在繁忙地處理數據,它會告知 Filebeat 減慢讀取速度。擁塞解決后,Filebeat 將恢復初始速度并繼續發送數據。

問題及解決方案

1. 問題:如何實現日志的多行合并功能?

系統應用中的日志一般都是以特定格式進行打印的,屬于同一條日志的數據可能分多行進行打印,那么在使用ELK收集日志的時候就需要將屬于同一條日志的多行數據進行合并。

解決方案:使用Filebeat或Logstash中的multiline多行合并插件來實現

在使用multiline多行合并插件的時候需要注意,不同的ELK部署架構可能multiline的使用方式也不同,如果是本文的第一種部署架構,那么multiline需要在Logstash中配置使用,如果是第二種部署架構,那么multiline需要在Filebeat中配置使用,無需再在Logstash中配置multiline。

1)multiline在Filebeat中的配置方式:

filebeat.prospectors:
    -
     paths:
          - /home/project/elk/logs/test.log
     input_type: log
     multiline:
      pattern: '^\['
      negate: true
      match: after
output:
   logstash:
      hosts: ["localhost:5044"]
  • pattern:正則表達式
  • negate:默認為false,表示匹配pattern的行合并到上一行;true表示不匹配pattern的行合并到上一行
  • match:after表示合并到上一行的末尾,before表示合并到上一行的行首

如:

pattern: '\['
negate: true
match: after

該配置表示將不匹配pattern模式的行合并到上一行的末尾

2)multiline在Logstash中的配置方式

input {
    beats {
    port => 5044
}
}

filter {
    multiline {
        pattern => "%{LOGLEVEL}\s*\]"
        negate => true
        what => "previous"
    }
}

output {
    elasticsearch {
    hosts => "localhost:9200"
    }
}

(1)Logstash中配置的what屬性值為previous,相當于Filebeat中的after,Logstash中配置的what屬性值為next,相當于Filebeat中的before。

(2)pattern => "%{LOGLEVEL}\s*\]" 中的LOGLEVEL是Logstash預制的正則匹配模式,預制的還有好多常用的正則匹配模式,詳細請看:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns

2. 問題:如何將Kibana中顯示日志的時間字段替換為日志信息中的時間?

默認情況下,我們在Kibana中查看的時間字段與日志信息中的時間不一致,因為默認的時間字段值是日志收集時的當前時間,所以需要將該字段的時間替換為日志信息中的時間。

解決方案:使用grok分詞插件與date時間格式化插件來實現

在Logstash的配置文件的過濾器中配置grok分詞插件與date時間格式化插件,如:

input {
    beats {
    port => 5044
    }
}

filter {
    multiline {
        pattern => "%{LOGLEVEL}\s*\]\[%{YEAR}%{MONTHNUM}%{MONTHDAY}\s+%{TIME}\]"
        negate => true
        what => "previous"
}

grok {
 match => [ "message" , "(?<customer_time>%{YEAR}%{MONTHNUM}%{MONTHDAY}\s+%{TIME})" ]
}

date {
     match => ["customer_time", "yyyyMMdd HH:mm:ss,SSS"] //格式化時間
     target => "@timestamp" //替換默認的時間字段
    }
}

output {
    elasticsearch {
    hosts => "localhost:9200"
    }
}

如要匹配的日志格式為:[DEBUG][20170811 10:07:31,359][DefaultBeanDefinitionDocumentReader:106] Loading bean definitions,解析出該日志的時間字段的方式有:

① 通過引入寫好的表達式文件,如表達式文件為customer_patterns,內容為:CUSTOMER_TIME %{YEAR}%{MONTHNUM}%{MONTHDAY}\s+%{TIME}

注:內容格式為:[自定義表達式名稱] [正則表達式]

然后logstash中就可以這樣引用:

filter {
    grok {
    patterns_dir => ["./customer-patterms/mypatterns"] //引用表達式文件路徑
    match => [ "message" , "%{CUSTOMER_TIME:customer_time}" ] //使用自定義的grok表達式
    }
}

② 以配置項的方式,規則為:(?<自定義表達式名稱>正則匹配規則),如:

filter {
    grok {
    match => [ "message" , "(?<customer_time>%{YEAR}%{MONTHNUM}%{MONTHDAY}\s+%{TIME})" ]
    }
}

3. 問題:如何在Kibana中通過選擇不同的系統日志模塊來查看數據

一般在Kibana中顯示的日志數據混合了來自不同系統模塊的數據,那么如何來選擇或者過濾只查看指定的系統模塊的日志數據?

解決方案:新增標識不同系統模塊的字段或根據不同系統模塊建ES索引

1、新增標識不同系統模塊的字段,然后在Kibana中可以根據該字段來過濾查詢不同模塊的數據,這里以第二種部署架構講解,在Filebeat中的配置內容為:

filebeat.prospectors:
    -
   paths:
  - /home/project/elk/logs/account.log
   input_type: log
     multiline:
      pattern: '^\['
      negate: true
      match: after
   fields: //新增log_from字段
      log_from: account

    -
   paths:
  - /home/project/elk/logs/customer.log
   input_type: log
   multiline:
      pattern: '^\['
      negate: true
      match: after
   fields:
      log_from: customer
output:
   logstash:
      hosts: ["localhost:5044"]

通過新增:log_from字段來標識不同的系統模塊日志

2、根據不同的系統模塊配置對應的ES索引,然后在Kibana中創建對應的索引模式匹配,即可在頁面通過索引模式下拉框選擇不同的系統模塊數據。

filebeat.prospectors:
    -
   paths:
  - /home/project/elk/logs/account.log
     input_type: log
     multiline:
      pattern: '^\['
      negate: true
      match: after
   fields: //新增log_from字段
      log_from: account
    -
   paths:
  - /home/project/elk/logs/customer.log
   input_type: log
   multiline:
      pattern: '^\['
      negate: true
      match: after
   fields:
      log_from: customer
output:
   logstash:
      hosts: ["localhost:5044"]

這里以第二種部署架構講解,分為兩步:

① 在Filebeat中的配置內容為:

filebeat.prospectors:
    -
     paths:
      - /home/project/elk/logs/account.log
     input_type: log
     multiline:
       pattern: '^\['
       negate: true
       match: after
     document_type: account

    -
     paths:
      - /home/project/elk/logs/customer.log
     input_type: log
     multiline:
       pattern: '^\['
       negate: true
       match: after
     document_type: customer
output:
    logstash:
    hosts: ["localhost:5044"]

通過document_type來標識不同系統模塊

② 修改Logstash中output的配置內容為:

output {
    elasticsearch {
    hosts => "localhost:9200"
    index => "%{type}"
    }
}

在output中增加index屬性,%{type}表示按不同的document_type值建ES索引

總結

本文主要介紹了ELK實時日志分析的三種部署架構,以及不同架構所能解決的問題,這三種架構中第二種部署方式是時下最流行也是最常用的部署方式。

最后介紹了ELK作在日志分析中的一些問題與解決方案,說在最后,ELK不僅僅可以用來作為分布式日志數據集中式查詢和管理,還可以用來作為項目應用以及服務器資源監控等場景,更多內容請看官網。

責任編輯:武曉燕 來源: 碼猿技術專欄
相關推薦

2023-09-13 09:52:14

分布式鎖Java

2019-11-04 08:38:45

分布式事務主流TCC

2024-10-29 21:17:25

2020-03-31 16:13:26

分布式事務方案TCC

2014-04-09 14:59:55

Apache Spar

2024-09-02 22:49:33

2022-05-26 10:27:41

分布式互聯網

2023-04-03 10:00:00

Redis分布式

2016-09-18 22:47:57

分布式存儲GFSAFSLustre

2017-02-20 17:15:43

分布式存儲文件系統

2023-03-01 08:07:51

2025-06-04 01:00:00

2024-03-26 12:08:53

分布式事務存儲

2017-12-05 09:43:42

分布式系統核心

2023-01-06 09:19:12

Seata分布式事務

2024-01-10 08:02:03

分布式技術令牌,

2019-09-03 09:22:08

數據庫Redis算法

2025-05-14 04:00:00

2012-07-17 09:16:16

SpringSSH

2020-07-15 16:50:57

Spring BootRedisJava
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲日本免费 | 国产精品国产a级 | 精品欧美一区二区久久久伦 | 欧洲一级黄 | 久久久精品一区二区三区 | 日韩伦理一区二区 | 国产高清在线精品 | 国产午夜久久久 | 成人免费在线视频 | 日本免费视频 | 久久躁日日躁aaaaxxxx | 欧美日韩久久精品 | 成人av片在线观看 | 国产在线观看av | 欧美激情一区二区三级高清视频 | 99精品免费 | 找个黄色片 | 91最新视频| 午夜精品导航 | 一区二区在线 | 欧美日韩亚 | 午夜电影网 | 91精品国产一区二区三区 | 久久丁香 | 欧美三级免费观看 | 国产精品一卡二卡三卡 | 欧美日韩在线免费 | 精品视频一区二区三区在线观看 | 久久伊人一区二区 | 极品销魂美女一区二区 | 亚洲综合在 | 亚洲欧美日韩精品 | 天天干天天草 | 欧州一区二区 | 在线三级网址 | 成人免费高清 | 国产精品视频免费观看 | 日韩黄 | 欧美乱人伦视频 | www.99热.com| 久久精品久久综合 |