elasticsearch 在添加了Prune过滤器和KV过滤器之后,日志不会进行弹性搜索,elasticsearch,logstash,elastic-stack,logstash-grok,elk,elasticsearch,Logstash,Elastic Stack,Logstash Grok,Elk" /> elasticsearch 在添加了Prune过滤器和KV过滤器之后,日志不会进行弹性搜索,elasticsearch,logstash,elastic-stack,logstash-grok,elk,elasticsearch,Logstash,Elastic Stack,Logstash Grok,Elk" />

elasticsearch 在添加了Prune过滤器和KV过滤器之后,日志不会进行弹性搜索

elasticsearch 在添加了Prune过滤器和KV过滤器之后,日志不会进行弹性搜索,elasticsearch,logstash,elastic-stack,logstash-grok,elk,elasticsearch,Logstash,Elastic Stack,Logstash Grok,Elk,我正在学习麋鹿,并试图为我的项目做一名POC。我正在为我的项目中的示例集成日志应用KV过滤器,我可以看到很多额外的字段,因此我尝试应用prune过滤器和白名单中的某些字段。我可以看到日志在logstash服务器中打印出来,但日志不会进行弹性搜索。如果我移除过滤器,它将进入弹性搜索。请告知如何进一步调试此问题 filter { kv { field_split => "{},?\[\]" transform_key => "cap

我正在学习麋鹿,并试图为我的项目做一名POC。我正在为我的项目中的示例集成日志应用KV过滤器,我可以看到很多额外的字段,因此我尝试应用prune过滤器和白名单中的某些字段。我可以看到日志在logstash服务器中打印出来,但日志不会进行弹性搜索。如果我移除过滤器,它将进入弹性搜索。请告知如何进一步调试此问题

filter {
    kv {
            field_split => "{},?\[\]"
            transform_key => "capitalize"
            transform_value => "capitalize"
            trim_key => "\s"
            trim_value => "\s"
            include_brackets => false   
        }
    prune
    {
        whitelist_names => [ "App_version", "Correlation_id", "Env", "Flow_name", "host", "Instance_id", "log_level","log_thread", "log_timestamp", "message", "patient_id", "status_code", "type", "detail"]
    }
}

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "mule-%{+YYYY.MM.dd}"
    #user => "elastic"
    #password => "changeme"
  }
  stdout { codec => rubydebug }
}
我还需要两个建议

我还尝试在初始日志中使用grok过滤器,并尝试从样本日志中获取日志级别字段(时间和日志类型),然后将剩余日志发送到KV过滤器。有什么参考资料请分享。这就是我为它所做的努力。但是得到的是一份工作。我已通过源选项将msgbody传递到kv滤波器

grok {
        match => { "message" => "%{TIMESTAMP_ISO8601:timestamp}\s+%{LOGLEVEL:loglevel}\s+%{GREEDYDATA:msgbody}"}
        overwrite => [ "msgbody" ]
    }
我在示例日志中有消息字段,如下所示。当数据到达Kibana时,我可以看到两个消息字段标记,一个是完整日志,另一个是正确消息(突出显示)。这种变异对这种情况有效吗?有没有办法将完整日志名更改为其他名称

[2020-02-10 11:20:07.172]INFO Mule.api[[MuleRuntime].cpuLight.04: [main api test].api-main.CPU_LITE@256c5cf5: [主api测试].main api main/processors/0/processors/0.CPU_LITE @378f34b0]:事件:00000003{app_name=main api main,app_version=v1, env=测试,时间戳=2020-02-10T11:20:07.172Z, log={correlation_id=00000003,patient_id=12345678, 实例id=医院,消息=系统API的启动, flow_name=main api main}


删除筛选器错误

您的
prune
过滤器在
白名单\u name
列表中没有
@timestamp
字段,您的输出是基于日期的(
%{+YYYY.MM.dd}
),logstash需要输出中的
@timestamp
字段来提取日期

我已经用示例消息运行了您的管道,它按照预期工作,使用
prune
过滤器将消息发送到elasticsearch,但它存储在名为
mule-
的索引中,没有任何日期时间字段

没有
prune
过滤器,您的消息将logstash收到事件的时间用作
@timestamp
,因为您没有任何日期过滤器来更改它

如果使用日期时间字段(如
@timestamp
)为索引
mule-*
创建索引模式,则在Kibana上不会看到索引上没有相同日期时间字段的任何文档

grok错误

你的想法是错误的,你需要避开时间戳周围的方括号。Kibana有一个grok调试器,您可以在其中尝试您的模式

以下grok工作,将kv移动到grok后运行,并将
msgbody
作为源

grok {
    match => { "message" => "\[%{TIMESTAMP_ISO8601:timestamp}\]\s+%{LOGLEVEL:loglevel}\s+%{GREEDYDATA:msgbody}"}
    overwrite => [ "msgbody" ]
}
kv {
    source => "msgbody"
    field_split => "{},?\[\]"
    transform_key => "capitalize"
    transform_value => "capitalize"
    trim_key => "\s"
    trim_value => "\s"
    include_brackets => false
}
只需将输出结果运行到stdout,即可查看需要更改
prune
过滤器的过滤器

mutate {
    rename => ["message", "fullLogMessage"]
}
重复的消息字段

如果您将
kv
过滤器放在
grok
之后,您就不会复制
消息
字段,因为
kv
将大写字段,您将以包含完整日志的
消息
字段和包含内部消息的
消息
字段结束,日志存储字段区分大小写

但是,您可以使用
mutate
过滤器重命名任何字段

mutate {
    rename => ["message", "fullLogMessage"]
}

感谢您详细的回答和宝贵的时间。我还需要一个关于管道的建议。我试图从多个s3存储桶中挑选文件,并将其处理到单个ES。所以我打算为4个bucket创建4个管道,作为输入,作为输出。它会并行运行吗?因为如果我给检查桶的时间间隔为10min,那么处理管道1的第一次运行输入所需的时间超过10min s。管道2、3等将发生什么变化?那么,有没有什么方法可以单独运行所有的bucket,而不依赖于每个s3 bucket。您好,我正在尝试将grok filter中的两个字段添加到输出响应中,但我无法添加它。你能帮我吗?我已经更改了grok中的名称,如下所示,并将其添加到addfilter标签中。。。add_field=>{“loglevel”=>“%{loglevel}”“log_timestamp”=>“%{log_timestamp}”}我正试图以时间和字符串格式保存时间戳/loglevel您应该发布新问题,您的评论与原始问题无关。谢谢。。我将为grok问题发布一个新问题。请在新问题上帮助我,我也提出了一个新问题。