Logstash:基于文件名的动态字段名称
Logstash: Dynamic field names based on filename
我得到了一个格式为 <key>:<value>-<key>:<value>.log
的文件名,例如pr:64-author:mxinden-platform:aws.log
包含测试日志 运行。
我想通过 logstash 将文件的每一行流式传输到 elasticsearch。每一行都应被视为一个单独的文档。每个文档都应该根据文件名获取字段。所以例如对于上面的示例,假设日志行 17-12-07 foo something happened bar
将获取以下字段:pr
的值为 64
、author
的值为 mxinden
和 platform
值为 aws
.
在我写logstash配置的时间点我不知道字段的名称。
如何根据文件名中包含的字段向每一行动态添加字段?
目前的static方法是:
filter {
mutate { add_field => { "file" => "%{[@metadata][s3][key]}"} }
else {
grok { match => { "file" => "pr:%{NUMBER:pr}-" } }
grok { match => { "file" => "author:%{USERNAME:author}-" } }
grok { match => { "file" => "platform:%{USERNAME:platform}-" } }
}
}
文件名结构的更改没问题。
根据@dan-griffiths 回答我自己的问题:
像 pr=64,author=mxinden,platform=aws.log
这样的文件的解决方案是使用 Elasticsearch kv filter 例如:
filter {
kv {
source => "file"
field_split => ","
}
}
其中 file
是通过 AWS S3 输入插件从文件名中提取的字段。
我得到了一个格式为 <key>:<value>-<key>:<value>.log
的文件名,例如pr:64-author:mxinden-platform:aws.log
包含测试日志 运行。
我想通过 logstash 将文件的每一行流式传输到 elasticsearch。每一行都应被视为一个单独的文档。每个文档都应该根据文件名获取字段。所以例如对于上面的示例,假设日志行 17-12-07 foo something happened bar
将获取以下字段:pr
的值为 64
、author
的值为 mxinden
和 platform
值为 aws
.
在我写logstash配置的时间点我不知道字段的名称。
如何根据文件名中包含的字段向每一行动态添加字段?
目前的static方法是:
filter {
mutate { add_field => { "file" => "%{[@metadata][s3][key]}"} }
else {
grok { match => { "file" => "pr:%{NUMBER:pr}-" } }
grok { match => { "file" => "author:%{USERNAME:author}-" } }
grok { match => { "file" => "platform:%{USERNAME:platform}-" } }
}
}
文件名结构的更改没问题。
根据@dan-griffiths 回答我自己的问题
像 pr=64,author=mxinden,platform=aws.log
这样的文件的解决方案是使用 Elasticsearch kv filter 例如:
filter {
kv {
source => "file"
field_split => ","
}
}
其中 file
是通过 AWS S3 输入插件从文件名中提取的字段。