ELK 架構之 Logstash 和 Filebeat 配置使用(採集過濾)

来源:https://www.cnblogs.com/xishuai/archive/2018/05/22/spring-boot-log4j2-and-elk-logstash-filebeat.html
-Advertisement-
Play Games

相關文章: "ELK 架構之 Elasticsearch 和 Kibana 安裝配置" "ELK 架構之 Logstash 和 Filebeat 安裝配置" ELK 使用步驟:Spring Boot 日誌輸出到指定目錄,Filebeat 進行採集,Logstash 進行過濾,Elasticsearc ...


相關文章:

ELK 使用步驟:Spring Boot 日誌輸出到指定目錄,Filebeat 進行採集,Logstash 進行過濾,Elasticsearch 進行存儲,Kibana 進行展示。

Filebeat 示例配置(vi /etc/filebeat/filebeat.yml):

filebeat.prospectors:
- input_type: log
  paths:
    - /var/log/spring-boot-log4j2/*.log
  document_type: "spring-boot-log4j2" # 定義寫入 ES 時的 _type 值
  multiline:
    #pattern: '^\s*(\d{4}|\d{2})\-(\d{2}|[a-zA-Z]{3})\-(\d{2}|\d{4})'   # 指定匹配的表達式(匹配以 2017-11-15 08:04:23:889 時間格式開頭的字元串)
    pattern: '^\s*("{)'                         # 指定匹配的表達式(匹配以 "{ 開頭的字元串)
    negate: true                                # 是否匹配到
    match: after                                # 合併到上一行的末尾
    max_lines: 1000                             # 最大的行數
    timeout: 30s                                # 如果在規定的時候沒有新的日誌事件就不等待後面的日誌
  fields:
    logsource: node1
    logtype: spring-boot-log4j2

- input_type: log
  paths:
    - /var/log/messages
    #- /var/log/*.log
  document_type: "syslog" # 定義寫入 ES 時的 _type 值
  fields:
    logsource: node1
    logtype: syslog

#output.elasticsearch:
  #hosts: ["node1:9200"]

output.logstash:
  hosts: ["node1:10515"]

上面的配置需要註意幾點:

  • pattern:配置的正則表達式,是為了合併異常信息(而不是單行顯示),匹配以"{開頭的字元串(判斷是否 Json 格式),如果匹配不到的話,就進行合併行。
  • document_type:配置的是 Elasticsearch 的 Type 值,方便 Elasticsearch 對日誌數據的歸類。
  • logtype:新增的欄位,用於 Filebeat 和 Logstash 之間傳遞參數,進行過濾的判斷邏輯。

Logstash 示例配置(vi /etc/logstash/conf.d/logstash.conf):

input {
 beats {
   port => 10515
  }
}
filter {
  if [fields][logtype] == "syslog" {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{host}" ]
    }
    syslog_pri { }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
  }
  if [fields][logtype] == "spring-boot-log4j2" {
    json {
      source => "message"
      target => "data"
    }
  }
}
output {
  if [fields][logtype] == "spring-boot-log4j2"{
    elasticsearch {
      hosts => ["127.0.0.1:9200"]
      index => "spring-boot-log4j2-%{+YYYY.MM.dd}"
    }
  }

  if [fields][logtype] == "syslog"{
    elasticsearch {
      hosts => ["127.0.0.1:9200"]
      index => "filebeat-%{+YYYY.MM.dd}"
    }
  }
}

上面的配置需要註意幾點:

  • logstash.conf:配置文件可以配置多個,inputfilteroutput可以單獨文件配置。
  • fields logtype:就是上面 Filebeat 配置的欄位,這邊用來判斷服務來源,然後進行單獨的處理。
  • filter:過濾器做了兩件事,一個是使用grok插件,匹配數據和增加欄位值,另一個就是使用json插件,將字元串轉換成 Json 對象(會創建data層級結構,如果不想新建層級的話,刪掉target配置即可)。
  • output:根據logtype判斷,輸出到指定的 Elasticsearch 地址,以及創建指定的索引。

簡單總結下, Filebeat 是客戶端,一般部署在 Service 所在伺服器(有多少伺服器,就有多少 Filebeat),不同 Service 配置不同的input_type(也可以配置一個),採集的數據源可以配置多個,然後 Filebeat 將採集的日誌數據,傳輸到指定的 Logstash 進行過濾,最後將處理好的日誌數據,存儲到指定的 Elasticsearch。


好了,下麵我們測試下上面的配置,是否可行。

Logstash 和 Filebeat 配置好之後,重啟一下:

$ systemctl restart logstash && 
systemctl restart filebeat

Spring Boot 中log4j2.xml中的配置(參考文章):

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF" monitorInterval="30">
    <Properties>
        <Property name="LOG_PATTERN">%m%n%ex</Property>
        <Property name="LOG_FILE_PATH">/Users/xishuai/Downloads/logs</Property>
    </Properties>
    <Appenders>
        <Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </Console>
        <RollingFile name="FileAppender" fileName="${LOG_FILE_PATH}/spring-boot-log4j2-demo.log"
                     filePattern="${LOG_FILE_PATH}/spring-boot-log4j2-demo-%d{yyyy-MM-dd}-%i.log">
            <PatternLayout>
                <Pattern>${LOG_PATTERN}</Pattern>
            </PatternLayout>
            <Filters>
                <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY" />
            </Filters>
            <Policies>
                <SizeBasedTriggeringPolicy size="10MB" />
                <TimeBasedTriggeringPolicy interval="1" />
            </Policies>
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="ERROR">
            <AppenderRef ref="ConsoleAppender" />
            <AppenderRef ref="FileAppender"/>
        </Root>
    </Loggers>
</Configuration>

配置說明可以參考之前的文章,這邊的LOG_PATTERN配置改為了%m%n%ex,直接輸出日誌信息或異常信息。

測試代碼:

@Log4j2
@RestController
@EnableDiscoveryClient
@SpringBootApplication
public class SpringBootLog4j2Application implements ApplicationRunner {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootLog4j2Application.class, args);
    }

    @Override
    public void run(ApplicationArguments applicationArguments) throws Exception {
        logger.debug("Debugging log");
        logger.info("Info log");
        logger.warn("Hey, This is a warning!");
        logger.error("jack! We have an Error. OK");
        logger.fatal("xishuai! Fatal error. Please fix me.");
    }

@RequestMapping("/log")
    public String log() {

        log.error("{\"msg\":\"出現一個異常錯誤:請求連接失敗\",\"level\":\"ERROR\",\"createTime\":\"2018-5-21 20:22:22\",\"provider\":\"xishuai\",\"ip\":\"192.168.1.11\",\"stackTrace\":\"java.lang.Exception\\n\\tat com.example.log_demo.LogDemoTests.logCustomField(LogDemoTests.java:33)\\n\\tat org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)\\n\\tat org.junit.runner.JUnitCore.run(JUnitCore.java:137)\\n\\tat com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)\\n\\tat com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)\\n\\tat com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)\\n\\tat com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)\\n\",\"tag\":\"\",\"url\":\"\"}");

        return "Hello World ----spring-boot-log4j2";
    }
}

啟動服務,然後訪問http://localhost:8280/log,手動產生一條日誌數據(Json 格式)。

查看下 Elasticsearch 中產生的索引:

[root@node1 ~]# curl http://node1:9200/_cat/indices?v
health status index                         uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   .kibana                       _8JIwyIZTJ-y9p3_o04tdA   1   1          2            0     28.3kb         28.3kb
yellow open   spring-boot-log4j2-2018.05.21 IZuVdDfjRIGXR5Rei7-gFQ   5   1          2            0     29.1kb         29.1kb

可以看到,有一條新的索引spring-boot-log4j2-2018.05.21產生。

接著,我們使用 Kibana,創建一個索引模版(``spring-boot-log4j2-*):

然後,我們就可以看到日誌信息了:

第一條日誌數據中,紅框裡面是我們輸出的日誌信息,測試代碼中總共輸出了 5 種日誌級別的信息,因為配置文件中設置的日誌級別是ERROR,所以這邊ERROR以下的日誌不會輸出,另外,因為設置了日誌匹配規則,兩條數據都不是以"{開頭,這邊就將兩條日誌數據,合併成一條了。

我們再看一下自定義輸出的日誌信息(Json 格式):

測試代碼中輸出的是 Json 字元串,經過 Logstash 過濾處理之後,就轉換成 Json對象了。

另外,我們還可以data.level:ERROR這樣格式進行搜索,或者data.msg:(錯誤)格式進行模糊搜索。


還需要註意的是,上面多行合併的配置是在 Filebeat 中,如果每個服務都是一樣的規則,那麼每台伺服器都需要配置,如果規則更改了,這樣每台伺服器的 Filebat 配置都需要更改,就比較不方便。

Logstash 也提供了多行合併的配置功能,我們只需要這樣配置(使用codec/multiline):

input {
 beats {
   port => 10515
   codec => multiline {
            pattern => '^\s*({")'
            negate => true
            what => "previous"
        }
  }
}

效果和 Filebeat 配置是一樣的。

如果日誌組件使用 Log4j/Log4j2,Logstash 還提供了另一種處理 Log4j 的方式:input/log4j。與codec/multiline不同,這個插件是直接調用了org.apache.log4j.spi.LoggingEvent處理 TCP 埠接收的數據。

參考資料:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Vue.js 的核心是一個允許採用簡潔的模板語法來聲明式地將數據渲染進 DOM 的系統; 指令帶有首碼 v-,以表示它們是 Vue 提供的特殊特性; v-for 指令可以綁定數組的數據來渲染一個項目列表; 為了讓用戶和你的應用進行交互,我們可以用 v-on 指令添加一個事件監聽器,通過它調用在 Vu ...
  • 內容:Node.js應用組成,第一個應用創建+代碼 ###########################################################################Node.js 應用組成• 引入 required 模塊:我們可以使用 require 指令來載入 ...
  • __proto__、prototype傻傻分不清楚? 記住以下兩點:1.__proto__是每個對象都有的一個屬性,而prototype是函數才會有的屬性。2.__proto__指向的是當前對象的原型對象,而prototype指向的,是以當前函數作為構造函數構造出來的對象的原型對象 (寫在最前面,轉 ...
  • 深入css佈局(2) — 定位與浮動 在css知識體系中,除了css選擇器,樣式屬性等基礎知識外,css佈局相關的知識才是css比較核心和重要的點。今天我們來深入學習一下css佈局相關的知識。 上篇文章我們講完了css佈局中盒模型和元素分類的相關知識,同時介紹了box-sizing和行框。這篇我們繼 ...
  • 一 JS中有哪些數據類型? -- 共 6 種數據類型,其中 5 種基本數據類型Undefined,Null,Boolean,Number和 String,1 種複雜數據類型Object。因為ECMAScript不支持創建任何自定義的類型,所以最終所有的類型都是其中 6 種數據類型之一。(ES6中新增 ...
  • <el-table :data="tableData" stripe border style="width:100%" highlight-current-row> <el-table-column type="selection" width="55"> </el-table-column> < ...
  • 經實驗,$.serializeArray()獲取不到disabled的值,如果想要讓input元素變為不可用,可以把input設為readonly,而不是disabled; 還有一種情況獲取不到值,當頁面中有兩個一樣name值的標簽的時候,即使其中一個name值的input的樣式為 display: ...
  • 前段時間有朋友私信我 Vue + TypeScript 的問題,然後就打算寫一篇 Vue + TypeScript 封裝組件的文章 正好公司項目中需要封裝一個表頭查詢組件,就拿出來分享一下~ 組件的整體思路是通過一個 config 數組生成列表的頭部表單: PS:配合《Vue 爬坑之路(九)—— 用 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...