Logstash 将与第一行不同的行解析为 header

Logstash parsing different line than 1st line as header

我有一个示例数据:

employee_name,user_id,O,C,E,A,N
Yvette Vivien Donovan,YVD0093,38,19,29,15,36
Troy Alvin Craig,TAC0118,34,40,24,15,34
Eden Jocelyn Mcclain,EJM0952,20,37,48,35,34
Alexa Emma Wood,AEW0655,25,20,18,40,38
Celeste Maris Griffith,CMG0936,36,13,18,50,29
Tanek Orson Griffin,TOG0025,40,36,24,19,26
Colton James Lowery,CJL0436,39,41,27,25,28
Baxter Flynn Mcknight,BFM0761,42,32,28,17,22
Olivia Calista Hodges,OCH0195,37,36,39,38,32
Price Zachery Maldonado,PZM0602,24,46,30,18,29
Daryl Delilah Atkinson,DDA0185,17,43,33,18,25

并且 logstash 配置文件为:

input {
  file {
    path => "/path/psychometric_data.csv"
    start_position => "beginning"
  }
}
filter {
  csv {
      separator => ","
      autodetect_column_names => true
      autogenerate_column_names => true
  }
}
output {
    amazon_es {
       hosts => [ "https://xxx-xxx-es-xxx.xx-xx-1.es.amazonaws.com:443" ]
       ssl => true
       region => "ap-south-1"
       index => "psychometric_data"
    }
}

我希望第 1 行(即 employee_name、user_id、O、C、E、A、N)作为 Elasticsearch 字段名称(header),但我获取第 3 行(i.e.Troy Alvin Craig,TAC0118,34,40,24,15,34)如下 header。

 {
        "_index": "psychometric_data",
        "_type": "_doc",
        "_id": "md4hm3YB8",
        "_score": 1,
        "_source": {
          "15": "21",
          "24": "17",
          "34": "39",
          "40": "37",
          "@version": "1",
          "@timestamp": "2020-12-25T18:20:00.759Z",
          "message": "Ishmael Mannix Velazquez,IMV0086,22,37,17,21,39\r",
          "path": "/path/psychometric_data.csv",
          "Troy Alvin Craig": "Ishmael Mannix Velazquez",
          "host": "xx-ThinkPad-xx",
          "TAC0118": "IMV0086"
        }
 }

可能是什么原因?

如果您将 autodetect_column_names 设置为 true,则过滤器 interprets 将第一行视为列名。如果 pipeline.workers 设置为多个,那么就会争先恐后地查看哪个线程首先设置列名。由于不同的工作人员正在处理不同的行,这意味着它可能不会使用第一行。您必须将 pipeline.workers 设置为 1。

除此之外,java 执行引擎(默认启用)并不总是保持事件的顺序。 logstash.yml 中有一个设置 pipeline.ordered 可以控制它。在 7.9 中保持事件顺序当且仅当 pipeline.workers 设置为 1.

你不说你是哪个版本运行。对于从 7.0(当 java_execution 成为默认值)到 7.6 的任何版本,修复是使用 logstash.yml 中的 pipeline.java_execution: false--java_execution false 禁用 java 引擎命令行。对于从 7.7 开始的任何 7.x 版本,确保 pipeline.ordered 设置为 auto 或 true(auto 是 7.x 中的默认值)。在未来的版本中(8.x 可能)pipeline.ordered 将默认为 false。