filebeat收集日志到elsticsearch中并使用ingest node的pipeline處理

一、需求

使用 filebeat 收集系統(tǒng)中的日志到 elasticsearch 中。

  1. 讀取系統(tǒng)中的日志文件统锤,排除不需要的數(shù)據(jù)。
  2. 多行日志的處理炭庙。
  3. filebeat.yml中敏感的信息(比如:密碼)需要放置到filebeat keystore中饲窿。
  4. 使用自定義的索引模板。
  5. 收集到的日志去重焕蹄。
  6. 使用es的 ingest node 的pipeline 來(lái)處理數(shù)據(jù)(增加字段逾雄、刪除字段、修改數(shù)據(jù)類型等等)

二腻脏、實(shí)現(xiàn)

1鸦泳、filebeat.yml 配置文件的編寫(xiě)

filebeat.inputs:
- type: log
  # 是否啟動(dòng)
  enabled: true
  encoding: "utf-8"
  # 從那個(gè)路徑收集日志,如果存在多個(gè) input ,則這個(gè) paths 中的收集的日志最好不要重復(fù)永品,否則會(huì)出現(xiàn)問(wèn)題
  # 日志路徑可以寫(xiě)通配符
  paths:
    - "/Users/huan/soft/elastic-stack/filebeat/filebeat/springboot-admin.log"
  # 如果日志中出現(xiàn)了 DEBUG 的字樣做鹰,則排除這個(gè)日志
  exclude_lines:
    - "DEBUG"
  # 添加自定義字段
  fields:
    "application-servic-name": "admin"
  # fields 中的字段不放在根級(jí)別 ,true表示放在根級(jí)別
  fields_under_root: false
  # 添加一個(gè)自定義標(biāo)簽
  tags:
    - "application-admin"
  # 多行日志的處理鼎姐,比如java中的異常堆棧
  multiline:
    # 正則表達(dá)式
    pattern: "^\\[+"
    # 是否開(kāi)啟正則匹配钾麸,true:開(kāi)啟,false:不開(kāi)啟
    negate: true
    # 不匹配正則的行是放到匹配到正則的行的after(后面)還是before(前面)
    match: after
    # 多行日志結(jié)束的時(shí)間炕桨,多長(zhǎng)時(shí)間沒(méi)接收到日志饭尝,如果上一個(gè)是多行日志,則認(rèn)為上一個(gè)結(jié)束了
    timeout: 2s
  # 使用es的ignes node 的pipeline處理數(shù)據(jù)献宫,這個(gè)理論上要配置到output.elasticsearch下方钥平,但是測(cè)試的時(shí)候發(fā)現(xiàn)配置在output.elasticsearch下方不生效。
  pipeline: pipeline-filebeat-springboot-admin
  
# 配置索引模板的名字和索引模式的格式
setup.template.enabled: false
setup.template.name: "template-springboot-admin"
setup.template.pattern: "springboot-admin-*"

# 索引的生命周期姊途,需要禁用涉瘾,否則可能無(wú)法使用自定義的索引名字
setup.ilm.enabled: false

# 數(shù)據(jù)處理,如果我們的數(shù)據(jù)不存在唯一主鍵捷兰,則使用fingerprint否則可以使用add_id來(lái)實(shí)現(xiàn)
processors:
  # 指紋立叛,防止同一條數(shù)據(jù)在output的es中存在多次。(此處為了演示使用message字段做指紋寂殉,實(shí)際情況應(yīng)該根據(jù)不用的業(yè)務(wù)來(lái)選擇不同的字段)
  - fingerprint:
      fields: ["message"]
      ignore_missing: false
      target_field: "@metadata._id"
      method: "sha256"

# 輸出到es中
output.elasticsearch:
  # es 的地址
  hosts: 
    - "http://localhost:9200"
    - "http://localhost:9201"
    - "http://localhost:9202"
  username: "elastic"
  password: "123456"
  # 輸出到那個(gè)索引囚巴,因?yàn)槲覀冞@個(gè)地方自定義了索引的名字原在,所以需要下方的 setup.template.[name|pattern]的配置
  index: "springboot-admin-%{[agent.version]}-%{+yyyy.MM.dd}"
  # 是否啟動(dòng)
  enabled: true

注意??:
1友扰、索引的生命周期彤叉,需要禁用,否則可能無(wú)法使用自定義的索引名字村怪。
2秽浇、估計(jì)是filebeat(7.12.0)版本的一個(gè)bug,pipeline需要寫(xiě)在input階段甚负,寫(xiě)在output階段不生效柬焕。

2、創(chuàng)建自定義的索引模板

PUT /_template/template-springboot-admin
{
  # 任何符合 springboot-admin- 開(kāi)頭的索引都會(huì)被匹配到梭域,在索引創(chuàng)建的時(shí)候生效斑举。
  "index_patterns": ["springboot-admin-*"],
  # 一個(gè)索引可能匹配到多個(gè)索引模板,使用 order 來(lái)控制順序
  "order": 0,
  "mappings": {
    "properties": {
      "createTime":{
        "type": "date",
        "format": ["yyyy-MM-dd HH:mm:ss.SSS"]
      }
    }
  }
}

此處需要根據(jù)索引情況自定義創(chuàng)建稽煤,此處為了簡(jiǎn)單演示酬土,將createTime的字段類型設(shè)置為date馆揉。

3、加密連接到es用戶的密碼

由下方的配置可知

output.elasticsearch:
  username: "elastic"
  password: "123456"

用戶名是明文的赎懦,這個(gè)不安全,我們使用 filebeat keystore 來(lái)存儲(chǔ)密碼幻工。

1励两、創(chuàng)建keystore

./filebeat keystore create

2、添加一個(gè)ES_PASSWORD這個(gè)key

./filebeat keystore add ES_PASSWORD

在接下來(lái)的提示中囊颅,輸入密碼当悔。ES_PASSWORD是自定義的,待會(huì)在修改filebeat.yml配置文件中的 es output 中需要用到踢代。

3先鱼、列出keystore中已經(jīng)有了多少個(gè)key

./filebeat keystore list
filebeat keystore 操作

4、刪除keystore中的某個(gè)key

./filebeat keystore remove KEY(比如:ES_PASSWORD)

5奸鬓、修改filebeat.yml中es的密碼

es的密碼從filebeat keystore中獲取

4焙畔、使用es的ingest node 的pipeline來(lái)處理數(shù)據(jù)

ingest pipeline 使我們?cè)谒饕龜?shù)據(jù)之前,提供了對(duì)數(shù)據(jù)執(zhí)行通用轉(zhuǎn)換等操作串远。比如:可以轉(zhuǎn)換數(shù)據(jù)的類型宏多、刪除字段、增加字段等操作澡罚。

PUT _ingest/pipeline/pipeline-filebeat-springboot-admin
{
  "description": "對(duì)springboot-admin項(xiàng)目日志的pipeline處理",
  "processors": [
    {
      "grok": {
        "field": "message",
        "patterns": [
          """(?m)^\[%{INT:pid}\]%{SPACE}%{TIMESTAMP_ISO8601:createTime}%{SPACE}\[%{DATA:threadName}\]%{SPACE}%{LOGLEVEL:level}%{SPACE}%{JAVACLASS:javaClass}#(?<methodName>[a-zA-Z_]+):%{INT:linenumber}%{SPACE}-%{GREEDYDATA:message}"""
        ],
        "pattern_definitions": {
          "METHODNAME": "[a-zA-Z_]+"
        },
        "on_failure": [
          {
            "set": {
              "field": "grok_fail_message",
              "value": "{{_ingest.on_failure_message }}"
            }
          }
        ]
      },
      "set": {
        "field": "pipelineTime",
        "value": "{{_ingest.timestamp}}"
      },
      "remove": {
        "field": "ecs",
        "ignore_failure": true
      },
      "convert": {
        "field": "pid",
        "type": "integer",
        "ignore_failure": true
      }
    },
    {
      "convert": {
        "field": "linenumber",
        "type": "integer",
        "ignore_failure": true
      }
    },
    {
      "date": {
        "field": "createTime",
        "formats": [
          "yyyy-MM-dd HH:mm:ss.SSS"
        ],
        "timezone": "+8",
        "target_field": "@timestamp",
        "ignore_failure": true
      }
    }
  ]
}

5伸但、準(zhǔn)備測(cè)試數(shù)據(jù)

[9708] 2021-05-13 11:14:51.873 [http-nio-8080-exec-1] INFO  org.springframework.web.servlet.DispatcherServlet#initServletBean:547 -Completed initialization in 1 ms
[9708] 2021-05-13 11:14:51.910 [http-nio-8080-exec-1] ERROR com.huan.study.LogController#showLog:32 -請(qǐng)求:[/showLog]發(fā)生了異常
java.lang.ArithmeticException: / by zero
    at com.huan.study.LogController.showLog(LogController.java:30)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

6、運(yùn)行filebeat

./filebeat -e -c (filebeat配置文件的路徑)

解釋:

  1. -e 將日志輸出到stderr留搔,默認(rèn)輸出到sysloglogs/filebeat文件更胖。
  2. -c 指定 filebeat.yml 配置文件的路徑

7、查看結(jié)果

kibana上創(chuàng)建索引模式,然后查看日志却妨。

搜索日志

三饵逐、如何讀取同一個(gè)文件多次

刪除 data/registry 文件夾的內(nèi)容。不同的filebeat安裝方式彪标,data目錄的位置不同倍权,參考如下文檔 https://www.elastic.co/guide/en/beats/filebeat/current/directory-layout.html

四、數(shù)據(jù)去重

我們知道在es中捞烟,每個(gè)文檔數(shù)據(jù)都有一個(gè)文檔id薄声,默認(rèn)情況下這個(gè)文檔id是es自動(dòng)生成的,因此重復(fù)的文檔數(shù)據(jù)可能產(chǎn)生多個(gè)文檔题画。
解決思路如下:

# 數(shù)據(jù)處理默辨,如果我們的數(shù)據(jù)不存在唯一主鍵,則使用fingerprint否則可以使用add_id來(lái)實(shí)現(xiàn)
processors:
  # 指紋苍息,防止同一條數(shù)據(jù)在output的es中存在多次廓奕。(此處為了演示使用message字段做指紋,實(shí)際情況應(yīng)該根據(jù)不用的業(yè)務(wù)來(lái)選擇不同的字段)
  - fingerprint:
      fields: ["message"]
      ignore_missing: false
      target_field: "@metadata._id"
      method: "sha256"

五档叔、filebeat使用es ingest node pipeline遇到的一個(gè)坑

在使用 filebeat的過(guò)程中桌粉,我們從官網(wǎng)中可知,pipeline這個(gè)是寫(xiě)在output中的衙四。

pipeline出現(xiàn)的位置

但是在測(cè)試的過(guò)程中發(fā)現(xiàn)铃肯,寫(xiě)在output這個(gè)里面是不生效的,需要寫(xiě)在input這個(gè)地方传蹈,見(jiàn)配置文件押逼。
pipeline 出現(xiàn)的位置

網(wǎng)上對(duì)這個(gè)問(wèn)題的討論: https://github.com/elastic/beats/issues/20342

六、參考文檔

1惦界、https://www.elastic.co/guide/en/beats/filebeat/current/directory-layout.html
2挑格、https://www.elastic.co/guide/en/beats/filebeat/current/multiline-examples.html
3、https://www.elastic.co/guide/en/beats/filebeat/current/keystore.html
4沾歪、https://www.elastic.co/guide/en/beats/filebeat/current/fingerprint.html
5漂彤、https://www.elastic.co/guide/en/beats/filebeat/current/elasticsearch-output.html
6、github 上對(duì) filebeat 在output到es時(shí),pipeline不生效的討論
7灾搏、https://www.elastic.co/guide/en/elasticsearch/reference/7.12/ingest.html
8挫望、https://www.elastic.co/guide/en/elasticsearch/reference/7.12/index-templates.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市狂窑,隨后出現(xiàn)的幾起案子媳板,更是在濱河造成了極大的恐慌,老刑警劉巖泉哈,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛉幸,死亡現(xiàn)場(chǎng)離奇詭異破讨,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)奕纫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門提陶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人若锁,你說(shuō)我怎么就攤上這事搁骑「拢” “怎么了又固?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)煤率。 經(jīng)常有香客問(wèn)我仰冠,道長(zhǎng),這世上最難降的妖魔是什么蝶糯? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任洋只,我火速辦了婚禮,結(jié)果婚禮上昼捍,老公的妹妹穿的比我還像新娘识虚。我一直安慰自己,他們只是感情好妒茬,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布担锤。 她就那樣靜靜地躺著,像睡著了一般乍钻。 火紅的嫁衣襯著肌膚如雪肛循。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天银择,我揣著相機(jī)與錄音多糠,去河邊找鬼。 笑死浩考,一個(gè)胖子當(dāng)著我的面吹牛夹孔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播析孽,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼析蝴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了绿淋?” 一聲冷哼從身側(cè)響起闷畸,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吞滞,沒(méi)想到半個(gè)月后佑菩,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體盾沫,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年殿漠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赴精。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绞幌,死狀恐怖蕾哟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情莲蜘,我是刑警寧澤谭确,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站票渠,受9級(jí)特大地震影響逐哈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜问顷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一昂秃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧杜窄,春花似錦肠骆、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至荷科,卻和暖如春唯咬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背畏浆。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工胆胰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人刻获。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓蜀涨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蝎毡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子厚柳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容