【问题标题】:Regex in logstash mutate gsub to replace a character in a stringlogstash 中的正则表达式变异 gsub 以替换字符串中的字符
【发布时间】:2021-10-02 06:35:29
【问题描述】:

我正在尝试从替换为其他内容的字符串中获取双引号(放置在随机位置)。
这是日志-

msg="AUT30544: User chose to proceed on the sign-in notification page "Sign-In Notification Message""

实际上,这是 KV 在 logstash 的过滤器部分中解析的一部分。如果您注意到在双引号中的字符串内部有一个带引号的字符串。
但是,下面的字符串在KV-中被正确解析-

msg="AUT23278: User Limit realm restrictions successfully passed for /google_auth "

现在我创建了一个正则表达式来删除有问题的字符串中的双引号- https://regex101.com/r/o00oot/1/ 在logstash中应用它但没有任何改变。 下面是我的配置文件-

input {
        tcp {
                port => 1301
        }
}
filter {
                if "type=vpn" in [message] {
                        dissect {
                                mapping => { "message" => "%{reserved} id=firewall %{message1}" }
                        }
                        #mutate { gsub => ["message1",':'," "] }
                        #mutate { gsub => ["message1",'"',''] }
                        mutate {gsub => ["msg","(.*)\"(.*)\"(\")", "\1 '\2 '\3"] }
                        kv { source => "message1"  value_split => "=" whitespace => "strict" }   #field_split => " " remove_char_value => '"' }
                        geoip { source => "src"  }
                # \/ end of if vpn type log
                }
        else { drop {}  }
}

我可以使用tcpdump 捕获的类似日志是-

<134>Oct  2 11:24:45 1xx.xx.43.101 1 2021-10-02T11:24:45+05:30 canopus.domain1.com2 PulseSecure: - - - id=firewall time="2021-10-02 11:24:45" pri=6 fw=172.20.43.101 vpn=ive user=user1 realm="google_auth" roles="" proto=auth src=2xx.176.114.94 dst= dstname= type=vpn op= arg="" result= sent= rcvd= agent="" duration= msg="AUT30544: User chose to proceed on the sign-in notification page "Sign-In Notification Message""

stdout 上同类消息的标准输出。我可以看到双引号被转义,但它们仍然在解析中产生问题。

{
          "type" => "vpn",
          "user" => "user1",
            "fw" => "1xx.xx.43.101",
          "host" => "1xx.xx.4.63",
         "realm" => "google_auth",
           "src" => "1xx.66.50.112",
          "port" => 33003,
      "@version" => "1",
       "message" => "<13>Oct  2 11:54:39 1xx.xx.43.101 396 <134>1 2021-10-02T11:54:39+05:30 canopus.domain1.com2 PulseSecure: - - - id=firewall time=\"2021-10-02 11:54:39\" pri=6 fw=1xx.xx.43.101 vpn=ive user=user1 realm=\"google_auth\" roles=\"\" proto=auth src=1xx.66.50.112 dst= dstname= type=vpn op= arg=\"\" result= sent= rcvd= agent=\"\" duration= msg=\"AUT30544: User chose to proceed on the sign-in notification page \"Sign-In Notification Message\"\"",
         "geoip" => {
              "location" => {
            "lon" => 77.5937,
            "lat" => 12.9719
        },

如果有人知道KV 插件对这个问题的原生解决方案,我不需要在gsub 中经历regex 的麻烦。

【问题讨论】:

    标签: regex logstash elastic-stack


    【解决方案1】:

    我不确定您是否可以在整个消息上使用kv,尝试将其拆分,以便在单独的字段中获取消息的键/值部分,然后在其上使用kv。话虽如此,我建议您在这里完全跳过使用gsub,因为kv 过滤器有一个名为trim_value 的选项。

    使用该选项,您的配置将如下所示。免责声明,这未经测试,也许你必须在trim_value 中使用正则表达式,但这是更简单的处理方式。

    input {
        tcp {
            port => 1301
        }
    }
    
    filter {
        if "type=vpn" in [message] {
            dissect {
                    mapping => { "message" => "%{reserved} id=firewall %{message1}" }
            }
            kv {
                source => "message1" 
                value_split => "="
                whitespace => "strict"
                trim_value => "\\\""
            }
            geoip {
                source => "src"
            }
        }
        else {
            drop { } 
        }
    }
    

    【讨论】:

    • 谢谢菲利普。我添加了 trim_value ,但没有帮助。
    • 您尝试了哪些变体,结果如何?
    • 我完全应用了trim_value =&gt; "\\\"",但我仍然可以看到双引号没有被转义
    • 我喜欢以增量方式进行更改,当您 gsub 时,将新的 msg/字段索引到 elasticsearch 或打印到文件,然后在文件或 Kibana 上进一步探索它以查看两者之间的更改新旧领域。
    猜你喜欢
    • 2015-11-30
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    相关资源
    最近更新 更多