elasticsearch 如何删除Logstash中CSV的前几行
这是我用于logstash的输入elasticsearch 如何删除Logstash中CSV的前几行,elasticsearch,logstash,elasticsearch,Logstash,这是我用于logstash的输入 ItemId,AssetId,ItemName,Comment 11111,07,ABCDa,XYZa 11112,07,ABCDb,XYZb 11113,07,ABCDc,XYZc 11114,07,ABCDd,XYZd 11115,07,ABCDe,XYZe 11116,07,ABCDf,XYZf 11117,07,ABCDg,XYZg Date,Time,Mill Sec,rows,columns 19-05-2020,13:03:46,534,2,2 1
ItemId,AssetId,ItemName,Comment
11111,07,ABCDa,XYZa
11112,07,ABCDb,XYZb
11113,07,ABCDc,XYZc
11114,07,ABCDd,XYZd
11115,07,ABCDe,XYZe
11116,07,ABCDf,XYZf
11117,07,ABCDg,XYZg
Date,Time,Mill Sec,rows,columns
19-05-2020,13:03:46,534,2,2
19-05-2020,13:03:46,539,2,2
19-05-2020,13:03:46,544,2,2
19-05-2020,13:03:46,549,2,2
19-05-2020,13:03:46,554,2,2
我需要从csv中删除前8行,将下一行作为列标题,并像往常一样解析其余的行。有没有办法在logstash中这样做?您的内容不是CSV格式。您的任务是将其转换为真正的CSV格式。您的内容不是CSV格式。您的任务是将其转换为真正的CSV格式。您应该在文件进入日志存储之前执行此操作。在Logstash中有很多方法可以做到这一点,例如使用
mutliline
code,然后执行奇异的grok
匹配以删除前N行(或删除行直到特定的正则表达式),然后执行split
然后执行普通的ol'csv
过滤器。对于标题行,您需要比平常更加小心。真是一团糟
最好在Logstash前面放一些东西来处理这个问题
如果文件是logstash实例的本地文件,则可以使用来处理异常情况
输入{
执行官{
command=>“/path/to/command_或_script”#sh或py或js等
间隔=>60
}
}
在Linux上,此命令将从…上的第8行打印一个文件
command => "tail +8 /path/to/file"
这一行(同样适用于Linux)将删除所有内容,直到以日期开始的一行,然后打印所有内容
command => "sed -n -e '/^date/,$p' /path/to/file"
通过在脚本中删除或归档同一文件(而不是这些示例中使用的一行程序),可以避免重复读取同一文件
修剪不需要的前导行后,您应该能够以正常方式使用csv
过滤器
请注意,如果要自动检测列名称
,则必须将管道工作线程设置为1。您应该在文件进入日志存储之前执行此操作。在Logstash中有很多方法可以做到这一点,例如使用mutliline
code,然后执行奇异的grok
匹配以删除前N行(或删除行直到特定的正则表达式),然后执行split
然后执行普通的ol'csv
过滤器。对于标题行,您需要比平常更加小心。真是一团糟
最好在Logstash前面放一些东西来处理这个问题
如果文件是logstash实例的本地文件,则可以使用来处理异常情况
输入{
执行官{
command=>“/path/to/command_或_script”#sh或py或js等
间隔=>60
}
}
在Linux上,此命令将从…上的第8行打印一个文件
command => "tail +8 /path/to/file"
这一行(同样适用于Linux)将删除所有内容,直到以日期开始的一行,然后打印所有内容
command => "sed -n -e '/^date/,$p' /path/to/file"
通过在脚本中删除或归档同一文件(而不是这些示例中使用的一行程序),可以避免重复读取同一文件
修剪不需要的前导行后,您应该能够以正常方式使用csv
过滤器
请注意,如果您想自动检测列名称
,则必须将管道工作者设置为1。您可以使用文件输入执行此操作,然后使用grok逐行读取,以确保它具有正确数量的逗号分隔字段,并忽略标题
您的输入将如下所示:
input {
file {
path => "/path/to/my.csv"
start_position => beginning
}
}
filter {
grok {
match => { "message" => [
"^%{DATE:Date},%{TIME:Time},%{NUMBER:Mill_Sec},%{NUMBER:rows},%{NUMBER:colums}$"
]
}
}
}
{
"colums": "2",
"Time": "13:03:46",
"Mill_Sec": "554",
"rows": "2",
"Date": "19-05-2020"
}
output {
if "_grokparsefailure" not in [tags] {
elasticsearch {
...
}
}
}
这将把每一行读取到一个事件中,其中包含名为message的字段中的数据,然后将其发送到过滤器。
在过滤器中,您将使用具有如下模式的grok:
input {
file {
path => "/path/to/my.csv"
start_position => beginning
}
}
filter {
grok {
match => { "message" => [
"^%{DATE:Date},%{TIME:Time},%{NUMBER:Mill_Sec},%{NUMBER:rows},%{NUMBER:colums}$"
]
}
}
}
{
"colums": "2",
"Time": "13:03:46",
"Mill_Sec": "554",
"rows": "2",
"Date": "19-05-2020"
}
output {
if "_grokparsefailure" not in [tags] {
elasticsearch {
...
}
}
}
这会将每一行显示为如下所示的事件:
input {
file {
path => "/path/to/my.csv"
start_position => beginning
}
}
filter {
grok {
match => { "message" => [
"^%{DATE:Date},%{TIME:Time},%{NUMBER:Mill_Sec},%{NUMBER:rows},%{NUMBER:colums}$"
]
}
}
}
{
"colums": "2",
"Time": "13:03:46",
"Mill_Sec": "554",
"rows": "2",
"Date": "19-05-2020"
}
output {
if "_grokparsefailure" not in [tags] {
elasticsearch {
...
}
}
}
在转到输出部分之前,可以使用mutate删除不需要的字段(如message)。如果与定义的模式不匹配,您将得到一个标签,标签中的值为\u grokparsefailure
,您可以使用该值决定是否将其发送到输出。正如您定义的,它必须是数字,它也会在标题1上失败,因此只留下“真实”事件
这可以通过如下方式定义输出来实现:
input {
file {
path => "/path/to/my.csv"
start_position => beginning
}
}
filter {
grok {
match => { "message" => [
"^%{DATE:Date},%{TIME:Time},%{NUMBER:Mill_Sec},%{NUMBER:rows},%{NUMBER:colums}$"
]
}
}
}
{
"colums": "2",
"Time": "13:03:46",
"Mill_Sec": "554",
"rows": "2",
"Date": "19-05-2020"
}
output {
if "_grokparsefailure" not in [tags] {
elasticsearch {
...
}
}
}
您可以使用文件输入来执行此操作,然后使用grok逐行读取它,以确保它具有正确数量的逗号分隔字段,并忽略标题字段
您的输入将如下所示:
input {
file {
path => "/path/to/my.csv"
start_position => beginning
}
}
filter {
grok {
match => { "message" => [
"^%{DATE:Date},%{TIME:Time},%{NUMBER:Mill_Sec},%{NUMBER:rows},%{NUMBER:colums}$"
]
}
}
}
{
"colums": "2",
"Time": "13:03:46",
"Mill_Sec": "554",
"rows": "2",
"Date": "19-05-2020"
}
output {
if "_grokparsefailure" not in [tags] {
elasticsearch {
...
}
}
}
这将把每一行读取到一个事件中,其中包含名为message的字段中的数据,然后将其发送到过滤器。
在过滤器中,您将使用具有如下模式的grok:
input {
file {
path => "/path/to/my.csv"
start_position => beginning
}
}
filter {
grok {
match => { "message" => [
"^%{DATE:Date},%{TIME:Time},%{NUMBER:Mill_Sec},%{NUMBER:rows},%{NUMBER:colums}$"
]
}
}
}
{
"colums": "2",
"Time": "13:03:46",
"Mill_Sec": "554",
"rows": "2",
"Date": "19-05-2020"
}
output {
if "_grokparsefailure" not in [tags] {
elasticsearch {
...
}
}
}
这会将每一行显示为如下所示的事件:
input {
file {
path => "/path/to/my.csv"
start_position => beginning
}
}
filter {
grok {
match => { "message" => [
"^%{DATE:Date},%{TIME:Time},%{NUMBER:Mill_Sec},%{NUMBER:rows},%{NUMBER:colums}$"
]
}
}
}
{
"colums": "2",
"Time": "13:03:46",
"Mill_Sec": "554",
"rows": "2",
"Date": "19-05-2020"
}
output {
if "_grokparsefailure" not in [tags] {
elasticsearch {
...
}
}
}
在转到输出部分之前,可以使用mutate删除不需要的字段(如message)。如果与定义的模式不匹配,您将得到一个标签,标签中的值为\u grokparsefailure
,您可以使用该值决定是否将其发送到输出。正如您定义的,它必须是数字,它也会在标题1上失败,因此只留下“真实”事件
这可以通过如下方式定义输出来实现:
input {
file {
path => "/path/to/my.csv"
start_position => beginning
}
}
filter {
grok {
match => { "message" => [
"^%{DATE:Date},%{TIME:Time},%{NUMBER:Mill_Sec},%{NUMBER:rows},%{NUMBER:colums}$"
]
}
}
}
{
"colums": "2",
"Time": "13:03:46",
"Mill_Sec": "554",
"rows": "2",
"Date": "19-05-2020"
}
output {
if "_grokparsefailure" not in [tags] {
elasticsearch {
...
}
}
}
我已将其更改为csv。如果您知道解决方案,请回复。我的意思是CSV在顶行只有一个标题行。您的内容有两个标题行。我检查了参数列表,没有人为您服务:忽略第一个标题行,您是否可以跳过其余7行,然后在logstash中将该行作为列标题?我已将其更改为csv。如果您知道解决方案,请回复。我的意思是CSV在顶行只有一个标题行。您的内容有两个标题行。我检查了参数列表,没有人为您服务:忽略第一个标题行,你能跳过剩下的7行,并在logstash中将其后的行作为列标题吗?你能提供在logstash中执行第一段中提到的流程代码吗?你能提供在logstash中执行第一段中提到的流程代码吗?请提供流程代码。用snippets更新我的答案吗在标题的grok
match
过滤器中提及每个字段,或者只有第一个类似日期的字段适用于整行?