1. 程式人生 > >ELK 架構之 Logstash 和 Filebeat 配置使用(採集過濾)

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

相關文章:

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 中產生的索引:

[[email protected] ~]# 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 埠接收的資料。

參考資料:

相關推薦

ELK 架構 Logstash Filebeat 配置使用採集過濾

相關文章: ELK 使用步驟:Spring Boot 日誌輸出到指定目錄,Filebeat 進行採集,Logstash 進行過濾,Elasticsearch 進行儲存,Kibana 進行展示。 Filebeat 示例配置(vi /etc/filebeat/filebeat.yml): filebeat.pr

ELK 架構 Logstash Filebeat 安裝配置

閱讀目錄: 1. 環境準備 2. 安裝 Logstash 3. 配置 Logstash 4. Logstash 採集的日誌資料,在 Kibana 中顯示 5. 安裝配置 Filebeat 6. Filebeat 採集的日誌資料,在 Kibana 中顯示 7. Filebeat 採集日誌資料,Logstas

1. PostgreSQL-安裝基本配置學習筆記

安裝和配置 日常使用 buffer java、 note 安裝完成 for ora har 1 PostgreSQL簡介1.1 概述??PostgreSQL數據庫是目前功能最強大的開源數據庫,支持豐富的數據類型(如JSON和JSONB類型,數組類型)和自定義類型。而且它提供

C編譯鏈接十八

C語言 編譯 靜態鏈接 動態鏈接 我們平時所做的編譯工作其實是由編譯器來完成的,那麽編譯器都是由哪幾部分構成的呢?包括四大部分:預處理器、編譯器、匯編器以及鏈接器組成。我們來看看一個由 file.c 文件是怎樣得到 file.o 文件的,如下 a> 預編譯:

機器學習numpymatplotlib學習十五

今天來學習矩陣的建立和一些基本運算 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Author : SundayCoder-俊勇 # @File : numpy7.py import numpy as np # numpy基

機器學習numpymatplotlib學習十四

今天繼續來講numpy中的一些基本函式使用。 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Author : SundayCoder-俊勇 # @File : numpy6.py import numpy as np # n

機器學習numpymatplotlib學習十二

今天主要來學習numpy中的一些特殊矩陣的建立,他們在機器學習中有很大的作用 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Author : SundayCoder-俊勇 # @File : numpy4.py import

機器學習numpymatplotlib學習十一

今天繼續來學習numpy。 學習有關複數矩陣在numpy中的建立和使用。 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Author : SundayCoder-俊勇 # @File : numpy3.py import

python基礎二列表元組元組

與列表一樣,元組也是序列。唯一的區別在於列表是可以修改的,而元組是不可以修改的。元組的定義很簡單的,在圓括號內,把元素用逗號隔開就可以建立一個元組。例如: num=(1,2,3,4,5) print(

java springcloud b2b2c shop 多使用者商城系統原始碼-spring cloudconfig的簡單配置shh方式

1、建立專案需要新增的依賴: 需要JAVA Spring Cloud大型企業分散式微服務雲構建的B2B2C電子商務平臺原始碼請加企鵝求求 :二一四七七七五六三三 <dependency> <groupId>org.springframework.boot<

Asp.net安全架構2:Session hijacking會話劫持

http://www.cnblogs.com/luminji/archive/2012/05/30/2511357.html 原理 會話劫持是指通過非常規手段,來得到合法使用者在客戶端和伺服器段進行互動的特徵值(一般為sessionid),然後偽造請求,去訪問授權使用

Android技術架構網路請求心路歷程可收藏

前言 Android架構 Android架構技術介紹 架構與設計 設計模式 重構 網路程式設計框架 TCP格式三次握手與四次揮手 HttpClient HttpURLConnection Volley OkHttp Retr

經典面試題getpost區別入門篇

1.標準答案GET在瀏覽器回退時是無害的,而POST會再次提交請求。GET產生的URL地址可以被Bookmark,而POST不可以。GET請求會被瀏覽器主動cache,而POST不會,除非手動設定。GET請求只能進行url編碼,而POST支援多種編碼方式。GET請求引數會被完

IDEA 學習筆記 安裝基本配置

window eclipse 自動 ref size 工作 ips ctr line 安裝和基本配置: 下載:https://www.jetbrains.com/idea/download/#section=windows 下載Zip安裝包: 基礎知識:

Linux添加防火墻、iptables的安裝配置親測

accept verbose conf inpu wall ron -h 數據流 ack iptables基礎 規則(rules)其實就是網絡管理員預定義的條件,規則一般的定義為“如果數據包頭符合這樣的條件,就這樣處理這個數據包”。規則存儲在內核空間的信息

Jasper Report自定義組件Custom Visualization環境配置

win 進行 studio one component add 。。 版本 inf Jasper Report提供的功能已經足夠強大了,但是仍不能完全對接客戶的需求,因此需要我們自定義組件完成對我們Report的設計,開發前的環境配置還是個麻煩事。。。 系統:Linux I

java集合系列——SetHashSetTreeSet介紹

最大 ... gpo 鏈表 key 同步 中大 nds set接口 一.Set的簡介Set是一個不包含重復元素的 collection。更確切地講,set 不包含滿足 e1.equals(e2) 的元素。對 e1 和 e2,並且最多包含一個為 null 的元素。 Set的類

白話windows server 2012 r2windows 7創建ad域與配置安全版

關閉 logo 打不開 cmd 2012 r2 以太網 子網 int 180天 文章的可讀性非常重要,這裏提供的是一鍵式操作指南,即使之前完全沒有接觸,也可以配置完成。 ad域的創建是為了便於公司的集中化管理,提高公司運作效率和安全性。 我的操作環境,本機是kali lin

C接續符轉義符十二

C語言 轉義符 接續符 我們今天來介紹下 C 語言中比較少見的兩種符號,接續符和轉義符。其實也不少見啦,只是我們平時不太註意罷了,下來我們就介紹下這兩種。 我們首先來介紹下接續符(\)。那麽接續符到底是什麽呢?它是C 語言中指示編譯器行為的利器。我們如何來使用接續符呢

樹莓派3 啟動 系統配置

sshd err date int pic imageview ras per c4c 在上一篇文章中系統已經燒寫到SD卡中了,接下來我們來啟動,啟動系統。為了方便操作,需要一個HDMI的顯示器,USB鼠標和鍵盤。啟動直接將SD卡放入樹莓派,通電就啟動了。不需要特殊配置就啟