【问题标题】:Logstash drop logs if field does not have value如果字段没有值,则 Logstash 丢弃日志
【发布时间】:2021-11-09 19:36:35
【问题描述】:

我有以下logstash.conf

input {
    tcp {
       port => 5000
      # codec => json { charset=>"UTF-8" }           

    }

    stdin {}
}

filter {

    if "userId" not in [contextMap] {
     drop {}
    }


    json {
            source => "message"
    }

 }

 output {
    elasticsearch {
            hosts => ["localhost:9200"]
            index => "logs"
            user => "user"
            password => "password"
    }

    stdout {}
 }

我在 logstash 中打印了 json 请求

{
"message" => " testing ,essage",
"instant" => {
    "nanoOfSecond" => 267000000,
    "epochSecond" => 1631632671
},
"thread" => "http-nio-8080-exec-1",
"level" => "INFO",
"loggerFqcn" => "org.apache.logging.slf4j.Log4jLogger",
"loggerName" => "",
"endOfBatch" => false,
"@version" => "1",
"@timestamp" => 2021-09-14T15: 17: 51.504Z,
"threadPriority" => 5,
"hostname" => "hostname",
"contextMap" => {
    "requestId" => "f6f65bab-bdd1-4cca-ba09-ff0d06d16e41",
    "userId" => "bc1289cd-d3ed-43ec-87ba-9c5ff9c5f205",
    "moduleName" => "LOGGER_SERVICE",
},
"host" => "hostname",
"threadId" => 139,
"port" => 55555
}

我想要实现的是 contextMap 字段没有 userId 字段的地方,应该删除日志。

有人能告诉我我做错了吗?

【问题讨论】:

    标签: elasticsearch logstash kibana


    【解决方案1】:

    if "userId" not in [contextMap] 可用于如果 [contextMap] 是字符串则进行子字符串匹配,或者如果 [contextMap] 是数组则用于数组成员资格测试。它不能用于测试密钥是否存在于哈希中。也就是说,你可以使用

    if ! [contextMap][userId] { drop {} }
    

    【讨论】:

    • 如果我尝试过滤 { if ! [contextMap][userId] { drop {} } json { source => "message" } } 没有收到日志@Badger
    • contextMap 是 JSON 的一部分吗?如果是这样,它在 json 过滤器执行之前将不存在,因此条件将丢弃所有内容。
    • 它是 json 的一部分。有解决办法吗?
    • 移动 json 过滤器,使其位于条件测试之前。
    【解决方案2】:

    我设法解决了这些问题。问题是我不想将某些日志加载到仅具有特定字段的弹性搜索。所以我把过滤器移到了输出部分。完整的logstash配置文件如下

    input {
      tcp {
       port => 5000
      # codec => json { charset=>"UTF-8" }           
    
      }
    
      stdin {}
    }
    
    filter {
      json {
         source => "message"
      }
    }
    
    output {
     if [contextMap][requestId]{
       elasticsearch {
            hosts => ["localhost:9200"]
            index => "logs"
            user => "user"
            password => "password"
       }
     }
     stdout {}
    }
    

    在家帮助别人

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      相关资源
      最近更新 更多