当前位置: 首页 > 知识库问答 >
问题:

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

方玄天
2023-03-14

我正在学习ELK,并试图为我的项目做一个POC。我正在为我的项目的样本集成日志应用KV过滤器,我可以看到很多额外的字段因此而出现,所以我尝试应用剪枝过滤器和白列某些字段。我可以看到日志在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过滤器。有什么参考资料请分享。这就是我为之所做的努力。但却像_grokparsefailure一样。我已通过源选项将msgbody传递到kv滤波器。

grok {
        match => { "message" => "%{TIMESTAMP_ISO8601:timestamp}\s+%{LOGLEVEL:loglevel}\s+%{GREEDYDATA:msgbody}"}
        overwrite => [ "msgbody" ]
    }

我在示例日志中有消息字段,如下所示。当数据转到Kibana我可以看到两个消息字段标签,一个是完整日志,另一个是正确的消息(高亮显示)。这种变异会对这种情况起作用吗?我们有什么方法可以把完整的日志名称更改为其他名称吗??

[2020-02-10 11:20:07.172]信息骡子。api[[MuleRuntime]。cpuLight。04:[主要api测试]。api main。CPU_LITE@256c5cf5:[主要api测试]。主api主/处理器/0/处理器/0。事件:00000003{app_name=main api main,app_version=v1,env=Test,timestamp=2020-02-10T11:20:07.172Z,log={correlation_id=00000003,patient_id=12345678,instance_id=hospital,message=Start of System api,flow_name=main api main}

共有1个答案

阎建中
2023-03-14

修剪滤波器误差

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

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

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

如果您创建了索引mule-*的索引模式,其中包含一个日期时间字段,如@timemark,您将不会在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过滤器所需的过滤器。

重复的消息字段

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

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

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

 类似资料:
  • 我正在尝试在Elastic 2中创建一个过滤索引别名。十、 以下是所有青少年的资料,不分性别。我只想在这个过滤器里看到雌性。 这就是我试图创建索引别名的原因: 我看了这个问题,似乎是相同的答案,但是我的JSON一定有问题。 Elasticsearch将范围和术语连接到相同的数组项

  • 这是回应的一部分 我有联系人号码和名字 现在我的第二个查询->我正在使用术语筛选器查询上面的联系电话

  • 像 这是我的质疑。这将作为呈现的响应 我的第一次尝试是将should的inside条件作为文本添加到一个节中

  • 我试图过滤查询使用范围按日期,但它不工作。如果我使用gt, gte, lt, lte它返回零结果。如果我只使用gt或lt,它返回一些结果,但过滤器不工作。 我检查了uri上的数据类型http://mydomain.local:9200/logstash-2014.09.09/_mapping?pretty=true字段类型是正确的: 以下是我在ElasticSearch中索引的结果示例: 下面是我

  • 如何在elasticsearch中使用与聚合相关的过滤器? 官方文档只给出了过滤器和聚合的小例子,没有对查询dsl进行正式描述——例如,将其与postgres文档进行比较。 通过尝试,我发现以下查询被elasticsearch接受(没有解析错误),但忽略了给定的过滤器: 有些人建议使用查询而不是过滤。但官方文件通常建议对精确值进行过滤。查询的另一个问题是:虽然过滤器提供了和,但查询不提供。 有人能