如何从字符串中提取关键字值
Posted
技术标签:
【中文标题】如何从字符串中提取关键字值【英文标题】:How can I extract key word value from a string 【发布时间】:2020-05-25 05:33:57 【问题描述】:我正在使用这个工具https://grokdebug.herokuapp.com/ 来测试我的 grok 解析器。我拥有的原始字符串类似于:
2020-05-01 01:59:10 server1 17.5.36.8 POST /v1/user.aspx r=1000&11:59:11.219&Method=Start&Credentials=xxxxxx:++http://localhost/v1/user.aspx&Reque
我想将数据解析为:
Method: Start,
r: 1000
Credential: xxxxx
我正在查看解析器 https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns,但我找不到一个好用的。
【问题讨论】:
【参考方案1】:我不知道如何仅使用 grok 模式来实现这一点。如果您也在使用 Logstash,可以尝试以下解决方案:
图案:
%TIMESTAMP_ISO8601:timestamp\s%GREEDYDATA:server\s%IP:ip\s%GREEDYDATA:request_type\s%PATH:path\sr=%NUMBER:r&%TIME:some_time&Method=%GREEDYDATA:method&Credentials=%GREEDYDATA:username:%GREEDYDATA:password%MY_URI:uri
它适用于custom pattern:
MY_URI http://(?:%USER(?::[^@]*)?@)?(?:%URIHOST)?(?:%URIPATHPARAM)?
我使用了自定义模式,因为原始 %URI 模式中的 %URIPROTO 不会正确地将凭据与 uri 分开。我假设凭据以以下格式给出:
username:password
如果我错了,请替换:
Credentials=%GREEDYDATA:username:%GREEDYDATA:password
与:
Credentials=%GREEDYDATA:credentials
如果 :++
字符串将凭据与 uri 分开,您可以使用它来应用 %URI 而不是 %MY_URI。
该模式适用于Grok Debugger。但是,Grok Constructor Matcher 中的输出更具可读性。
由于您只对某些领域感兴趣,请使用remove_field 插件。使用add_field 插件将结果包含在一个新字段中。
您的logstash.conf
文件可能如下所示(如果您将具有自定义模式的文件放在配置文件旁边的patterns
目录中):
# logstash.conf
…
filter
grok
patterns_dir => ["./patterns"]
match =>
"message" => "%TIMESTAMP_ISO8601:timestamp\s%GREEDYDATA:server\s%IP:ip\s%GREEDYDATA:request_type\s%PATH:path\sr=%NUMBER:r&%TIME:some_time&Method=%GREEDYDATA:method&Credentials=%GREEDYDATA:username:%GREEDYDATA:password%MY_URI:uri"
mutate
add_field => "result" => "Method: %method, r: %r Credential: %username
remove_field => ["timestamp", "server", "ip", "request_type", "path", "some_time", "password", "uri", "method", "r", "username"]
…
【讨论】:
以上是关于如何从字符串中提取关键字值的主要内容,如果未能解决你的问题,请参考以下文章