Logstash - 将日志拆分为 csv 文件

Logstash - splitting the log into a csv file

我想用logstash通过这些日志中出现的一个常量值来分隔相应的日志,然后在分隔符(“|”)之后将日志分成几块,并放入一个csv文件中 headers.我要查找的日志由常量 (WID2) 识别。我还注意到 GREEDYDATA 提取的消息在大约 85 个字符后被截断

示例日志: 2022-01-02 10:32:30,0000001 | WID2 | 3313141414 |请求 | STEP_1 |好的 |留言

我想从这个日志中创建包含 headers 的 csv 文件:TIMESTAMP、VALUE、MESSAGE_TYPE、STEP、STATUS、MESSAGE。我不想在 csv 文件中保存常量值 (WID2),它只用于在其他文件中查找我的日志。

我写了但是没用:

input {
 file {
  path => ["path"]
  start_position => "beginning"
  sincedb_path => "path"
 }
}

filter {
 grok {
  match => {
   "message" => "%{GREEDYDATA:SYSLOGMESSAGE}"
    }
   }
 if ([SYSLOGMESSAGE] !~ "WID2"){
  drop {}
 }
 if([SYSLOGMESSAGE] =~ 'WID2") {
  csv {
   separator => "|"
   columns => ["TIMESTAMP", "VALUE", "MESSAGE_TYPE", "STEP", "STATUS", "MESSAGE"]
  }
 }
}

output{
 file {
  path => ["path.csv"]
 }
}

如果您的日志消息采用这种格式:

2022-01-02 10:32:30,0000001 | WID2 | 3313141414 | Request | STEP_1 | OK | Message

并且您想解析每条包含 WID2 的邮件,以下过滤器将起作用。

filter {
    if "WID2" in [message] {
        csv {
            separator => "|"
            columns => ["TIMESTAMP", "[@metadata][wid2]", "VALUE", "MESSAGE_TYPE", "STEP", "STATUS", "MESSAGE"]
        }
    } else {
        drop {}
    }
}

if 条件将测试消息中是否存在 WID2,如果为真,它将使用 csv 过滤器来解析它,因为第二列你的 csv 是值 WID2 而你不想保存它,你可以将它的值存储在字段 [@metadata][wid2] 中,这个元数据字段将不会出现在输出块中。

如果消息字段中不存在字符串 WID2,则事件将被删除。