ES & Filebeat 使用 Pipeline 處理日誌中的 @timestamp

使用 Pipeline 處理日誌中的 @timestamp

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

相關文章
相關標籤/搜索