我有一个Java应用程序,用于检索存储在ElasticSearch中的日志 . 日志存储方式如下(这是您从ElasticSearch检索的内容):
{
"took":1013,
"timed_out":false,
"_shards":{"total":40,"successful":40,"failed":0},
"hits":{"total":28,"max_score":null,"hits":
[
{
"_shard":"[logstash-2017.09.06][0]",
"_node":"_G934CTGTjKypnI_D1b1Lg",
"_index":"logstash-2017.09.06",
"_type":"logs",
"_id":"AV5WyiTlbV8ga6rEI4b8",
"_score":null,
"_source":{"@timestamp":"2017-09-06T10:44:01.691Z",
"@version":"1",
"message":"{
\"log\":\"2017-09-19 09:26:09,149 INFO [com.mycompany.class.MyClass] (default task-23) Some log to retrieve\",
\"stream\":\"stderr\",
\"docker\":{
\"container_id\":\"61b34e11002c636b289e7c40d6fbc6718e0deec58bf8a3410d598e3bd561672d\"
},
\"metadata\":{
\"container_name\":\"router\",
\"namespace_name\":\"default\",
\"cluster_name\":\"cluster\"
}
}"
},
"sort":[1504694641691]
}
]
}
}
要仅获取包含“INFO”一词的日志,我想查询“消息”,但是日志在“日志”中,我只想查询“日志”内的单词\” .
我想也许如果我查询“message.log”它可以工作,但它没有 . 它不是嵌套的json(“message”:{key:value,key:value}),它是“message”:“”(有双引号):_(
如果日志存储像“日志”:“日志”没有别的,但我无法改变将日志放入ElasticSearch的logstash的行为 .
所以我尝试使用正则表达式(QueryBuilders.regexpQuery(“message”,“Some_regex”))和以下正则表达式:
.*\"log\\\":\\\".*INFO.*},\\\"metadata\\\":{
我知道这个正则表达式也影响\“stream \”或\“docker \”,但这不是问题 .
我在http://regexr.com/和https://regex101.com/中测试了这个正则表达式它应该可以工作,但是当我进行查询时,我找到0个结果(并且应该有结果) .
我试用错误测试了更多的正则表达式,但如果我之后添加了任何内容,它就没有找到结果
.*\"log\\\":\\\".*INFO
我不是很习惯正则表达式,我确实想在没有你帮助的情况下成功完成它,但我现在有点迷失了......
提前谢谢你,抱歉我的英语不好 . 谢谢!
1 回答
Here是一个正则表达式,用于对
INFO
部分之后的内容进行分组:说明: - 匹配一个反斜杠需要
\\
- 括号(.*)
用于分组 . 您可以稍后检索它们 .java中的用法有点棘手 . 即如果你想将这个字符串指定为java String literal,那么你得到这个:
看起来很奇怪,但你总能测试我是否正确地逃脱了它们:
那么,这是如何在java中使用这个正则表达式: