Filebeat 收集的日誌發送到 ElasticSearch 後,會默認添加一個 @timestamp 字段做爲時間戳用於檢索,而日誌中的信息會所有添加到 message 字段中,可是這個時間是 Filebeat 採集日誌的時間,不是日誌生成的實際時間,因此爲了便於檢索日誌,須要將 @timestamp 替換爲 message 字段中的時間。json
這裏使用的是 elasticseatch 提供的 pipeline 來進行替換。首先日誌格式以下:bash
20-09-22 07:01:25.109 INFO - {"traceId":"65e97e88a61d7cd4558b8f3a203458fd"} 20-09-22 06:51:12.117 INFO - {"traceId":"4e0542c994919065f71536872ccb9677"}
在 Kibana 中的 Devtools 界面中編寫以下 pipeline 並執行:elasticsearch
PUT _ingest/pipeline/test-news-server-online # test-news-server-online 爲流水線的名稱 { "description": "test-news-server-online", # 對 pipeline 進行描述 "processors": [ { "grok": { # 使用 grok 對日誌內容進行提取 "field": "message", # 選擇要提取信息的字段 "patterns": [ "%{TIMESTAMP_ISO8601:logatime}" # 使用 TIMESTAMP_ISO8601 的標準匹配時間,將匹配的值賦值給新增的字段 logatime ], "ignore_failure": true # 若是日誌中有不存在時間戳的行,能夠添加這個配置來忽略匹配錯誤產生的 error 信息 }, "date": { # 使用 data 時間戳插件來格式化時間輸出,替代默認的 @timestamp "field": "logatime", # 指定使用新增的 logatime 字段 "timezone": "Asia/Shanghai", # 指定輸出時間的時區,不指定的話可能會比正確的時間晚 8 個小時 "formats": [ "yy-MM-dd HH:mm:ss.SSS" # 指定時間輸出的格式 ], "ignore_failure": true # 若是遇到錯誤則忽略 } } ] }
pipeline 編寫完成後,在 Devtools 中可使用以下命令進行查詢:插件
GET _ingest/pipeline/test-news-server-online
在 filebeat 中引用這個 pipeline:日誌
filebeat.idle_timeout: 2s filebeat.inputs: - backoff: 1s backoff_factor: 2 close_inactive: 1h enabled: true encoding: plain harvester_buffer_size: 262144 max_backoff: 10s max_bytes: 10485760 paths: - /opt/trace.log scan_frequency: 10s tail_lines: true type: log fields: type: test-news-server filebeat.name: filebeat-shiper filebeat.spool_zie: 50000 output.elasticsearch: bulk_max_size: 8192 hosts: - 10.11.16.211:30187 - 10.11.16.212:30187 - 10.11.16.213:30187 - 10.11.16.214:30187 - 10.11.16.215:30187 index: test-news-timestamp workers: 4 pipeline: "test-news-server-online" # 在此處指定 pipeline 的名稱 processors: - drop_fields: fields: - agent.ephemeral_id - agent.hostname - agent.id - agent.type - agent.version - ecs.version - input.type - log.offset - version - decode_json_fields: fields: - message max_depth: 1 overwrite_keys: true setup.ilm.enabled: false setup.template.name: test-news-timestamp-reverse setup.template.pattern: test-news-timestamp-reverse-*
運行 filebeat,在 kibana 中查看日誌信息,能夠看到收集的日誌信息中新增了 logatime 字段,@timestamp 字段的時間也與 logatime 字段保持了一致。code
若是在 filebeat 運行的日誌中發現了以下報錯信息,有多是日誌中存在不含有時間戳的行(通常是因爲日誌被截斷致使的,能夠參考處理多行日誌的文檔):orm
ERROR pipeline/output.go:121 Failed to publish events: temporary bulk send failure
若是不但願將 logatime 字段在日誌中展現的話,能夠將 pipeline 修改成以下內容:server
PUT _ingest/pipeline/test-news-server-online { "description": "test-news-server-online", "processors": [ { "grok": { "field": "message", "patterns": [ "%{TIMESTAMP_ISO8601:logatime}" ], "ignore_failure": true }, "date": { "field": "logatime", "timezone": "Asia/Shanghai", "formats": [ "yy-MM-dd HH:mm:ss" ], "ignore_failure": true }, "remove": { "field": "logatime" } } ] }
若是但願將 logatime 的值同時賦值給其餘的新增字段,例如 realtime ,pipeline 修改以下:ip
PUT _ingest/pipeline/test-news-server-online { "description": "test-news-server-online", "processors": [ { "grok": { "field": "message", "patterns": [ "%{TIMESTAMP_ISO8601:logatime}" ], "ignore_failure": true }, "date": { "field": "logatime", "timezone": "Asia/Shanghai", "target_field": "realtime" "formats": [ "yy-MM-dd HH:mm:ss" ], "ignore_failure": true }, "remove": { "field": "logatime" } } ] }
target_field 字段用於將一個值賦值給指定的字段,默認是給 @timestamp ,若是未提供該選項,則會默認更新 @timestamp 字段rem