【问题标题】:How to resolve parsing error for CSV file in Logstash如何解决 Logstash 中 CSV 文件的解析错误
【发布时间】:2020-05-28 05:02:11
【问题描述】:

我正在使用 Filebeat 将 CSV 文件发送到 Logstash,然后再发送到 Kibana,但是当 Logstash 提取 CSV 文件时出现解析错误。

这是 CSV 文件的内容:

time    version id  score   type

May 6, 2020 @ 11:29:59.863  1 2 PPy_6XEBuZH417wO9uVe  _doc

logstash.conf:

input {
  beats {
    port => 5044
  }
}
filter {
  csv {
      separator => ","
      columns =>["time","version","id","index","score","type"]
      }
}
output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
  }
}

Filebeat.yml:

filebeat.inputs:

# Each - is an input. Most options can be set at the input level, so
# you can use different inputs for various configurations.
# Below are the input specific configurations.

- type: log

  # Change to true to enable this input configuration.
  enabled: true

  # Paths that should be crawled and fetched. Glob based paths.
  paths:
    - /etc/test/*.csv
    #- c:\programdata\elasticsearch\logs\*

以及Logstash中的错误:

[2020-05-27T12:28:14,585][WARN ][logstash.filters.csv     ][main] Error parsing csv {:field=>"message", :source=>"time,version,id,score,type,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", :exception=>#<TypeError: wrong argument type String (expected LogStash::Timestamp)>}
[2020-05-27T12:28:14,586][WARN ][logstash.filters.csv     ][main] Error parsing csv {:field=>"message", :source=>"\"May 6, 2020 @ 11:29:59.863\",1,2,PPy_6XEBuZH417wO9uVe,_doc,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", :exception=>#<TypeError: wrong argument type String (expected LogStash::Timestamp)>}

我确实在 Kibana 中获得了一些数据,但不是我想看到的。

【问题讨论】:

  • 你好 Calum Price,我注意到你的列名,我不禁注意到你正在使用所有的 logstash 保留字段名称:“@timestamp”、“@version”、“_id”其余的......另一件事是,@timestamp 字段应该是时间戳格式,您的时间戳在中间有一个“@”符号,这不符合 TIMESTAMP_ISO8601。尝试更改列名或更改时间戳格式以适应 ISO8601。最后,您的时间戳在当天之后有一个“,”,它可能导致 logstash 错误地拆分数据。
  • @eladyanai 更新了 csv 中的字段。类似的错误。 [2020-05-27T12:58:24,932][WARN][logstash.filters.csv][main] 解析 csv {:field=>"message", :source=>"time,version,id,score,type 时出错,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", :exception=>#}
  • 我不确定这是否相关,但您的 logstash 过滤器上有一个名为“_index”的额外列,并且在您的 csv 示例中它不存在。关于时间戳错误,能否请您提供最新的 csv 文件?和logstash conf?谢谢。
  • CSV:时间版本 ID 分数类型 2020 年 5 月 6 日 11:29:59.863 1 2 3 4 输入 {beats { port => 5044 } } filter { csv { separator => "," columns => ["time","version","id","score","type"] } } 输出 { elasticsearch { hosts => ["localhost:9200"] index => "%{[@metadata][beat]}- %{[@metadata][版本]}-%{+YYYY.MM.dd}" } }
  • @eladyanai 简化了用于测试的 CSV

标签: ruby csv logstash filebeat


【解决方案1】:

我已经设法让它在本地工作。到目前为止我注意到的错误是:

  1. 使用 @timestamp@version 等 ES 保留字段。
  2. 时间戳不是 ISO8601 格式。中间有一个@ 标志。
  3. 您的过滤器将分隔符设置为 ,,但您的 CSV 实际分隔符是 "\t"
  4. 根据错误,您可以看到它正在尝试在您的标题行上工作,我建议您将其从 CSV 中删除或使用 skip_header 选项。

下面是我使用的logstash.conf文件:

input {
    file {
        path => "C:/work/elastic/logstash-6.5.0/config/test.csv"
        start_position => "beginning"
    } 
}
filter { 
    csv { 
        separator => ","
        columns =>["time","version","id","score","type"]
    } 
} 
output { 
    elasticsearch { 
        hosts => ["localhost:9200"]
        index => "csv-test" 
    } 
}

我使用的 CSV 文件:

May 6 2020 11:29:59.863,1,PPy_6XEBuZH417wO9uVe,_doc
May 6 2020 11:29:59.863,1,PPy_6XEBuZH417wO9uVe,_doc
May 6 2020 11:29:59.863,1,PPy_6XEBuZH417wO9uVe,_doc
May 6 2020 11:29:59.863,1,PPy_6XEBuZH417wO9uVe,_doc

来自我的 Kibana:

【讨论】:

  • 这看起来应该可以解决问题,但是当我更新文件时会出现同样的错误。 [2020-05-27T14:02:04,742][WARN][logstash.filters.csv][main] 解析 csv {:field=>"message", :source=>"May 6 2020 11:29:59.863, 1,PPy_6XEBuZH417wO9uVe,_doc", :exception=>#}
  • 您使用的是什么版本的 logstash?你使用的是什么操作系统?显然错误消息是不同的,因为我不再在错误中看到所有这些 ,,,,,,,,,,。
  • v7.6.2, centos7.5。文件位置是 /etc/test/test.csv
  • Hi- 设法让这个工作。我这边的问题是配置中的更改必须没有被拾取。我停止了logstash并运行了守护进程重新加载。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多