一、需求
使用 filebeat 收集系統(tǒng)中的日志到 elasticsearch 中。
- 讀取系統(tǒng)中的日志文件统锤,排除不需要的數(shù)據(jù)。
- 多行日志的處理炭庙。
- filebeat.yml中敏感的信息(比如:密碼)需要放置到
filebeat keystore
中饲窿。 - 使用自定義的索引模板。
- 收集到的日志去重焕蹄。
- 使用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
4、刪除keystore中的某個(gè)key
./filebeat keystore remove KEY(比如:ES_PASSWORD)
5奸鬓、修改filebeat.yml中es的密碼
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配置文件的路徑)
解釋:
-
-e
將日志輸出到stderr留搔,默認(rèn)輸出到
sysloglogs/filebeat
文件更胖。 -
-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
中的衙四。
但是在測(cè)試的過(guò)程中發(fā)現(xiàn)铃肯,寫(xiě)在
output
這個(gè)里面是不生效的,需要寫(xiě)在input
這個(gè)地方传蹈,見(jià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