如何从 OpenShift EFK 堆栈中的日志条目中提取和可视化值
How to extract and visualize values from a log entry in OpenShift EFK stack
我有一个带有 EFK 堆栈的 OKD 集群设置用于日志记录,如 here 所述。我以前从未使用过其中一个组件。
一个部署记录包含我感兴趣的特定值的请求。我想仅提取此值并使用 Kibana 中显示请求数量及其来源的区域地图将其可视化。
message
字段的内容基本上是这样的:
[fooServiceClient#doStuff] {"somekey":"somevalue", "multivalue-key": {"plz":"12345", "foo": "bar"}, "someotherkey":"someothervalue"}
这个 plz
是德国邮政编码,我想按照描述对其进行可视化。
我的问题是我不知道如何提取这个值。
如果我能用正则表达式找到它,那将是一个很好的第一次成功,但 Kibana 似乎并不像我想的那样工作。按照它的文档,我希望这个 /\"plz\":\"[0-9]{5}\"/
能给我结果,但我得到 0 次点击(时间间隔设置正确)。即使这个正则表达式匹配,我也只会找到包含它的日志条目,而不仅仅是特定的值。我该如何继续?
我想我还需要一个外部地理编码服务,但我应该在什么时候包括它?或者 Kibana 本身知道如何将邮政编码映射到几何图形吗?
初学者友好的分步指南将是完美的,但我可以接受一些指导我的提示。
当文档被索引到 ES 时,可以使用 ingest pipeline with grok processor.
解析 message
字段
首先,像这样创建摄取管道:
PUT _ingest/pipeline/parse-plz
{
"processors": [
{
"grok": {
"field": "message",
"patterns": [
"%{POSINT:plz}"
]
}
}
]
}
然后,当您为数据编制索引时,您只需引用该管道:
PUT plz/_doc/1?pipeline=parse-plz
{
"message": """[fooServiceClient#doStuff] {"somekey":"somevalue", "multivalue-key": {"plz":"12345", "foo": "bar"}, "someotherkey":"someothervalue"}"""
}
你最终会得到一个如下所示的文档,它现在有一个名为 plz
的字段,其中包含 12345
值:
{
"message": """[fooServiceClient#doStuff] {"somekey":"somevalue", "multivalue-key": {"plz":"12345", "foo": "bar"}, "someotherkey":"someothervalue"}""",
"plz": "12345"
}
从 Fluentd 索引文档时,您可以在配置中 specify a pipeline to be used。如果您不能或不想修改您的 Fluentd 配置,您还可以为您的索引定义一个默认管道,该管道将在每次为新文档编制索引时启动。只需 运行 在您的索引上,您在索引文档时不需要指定 ?pipeline=parse-plz
:
PUT index/_settings
{
"index.default_pipeline": "parse-plz"
}
如果您有多个索引,更好的方法可能是定义一个 index template,这样每当创建一个名为 project.foo
-something 的新索引时,就会应用这些设置:
PUT _template/project-indexes
{
"index_patterns": ["project.foo*"],
"settings": {
"index.default_pipeline": "parse-plz"
}
}
现在,为了在地图上绘制该 PLZ,您首先需要找到一个数据集,为您提供每个 PLZ 的地理位置。
然后您可以在管道中添加第二个处理器,以便执行 PLZ/ZIP 到纬度、经度的映射:
PUT _ingest/pipeline/parse-plz
{
"processors": [
{
"grok": {
"field": "message",
"patterns": [
"%{POSINT:plz}"
]
}
},
{
"script": {
"lang": "painless",
"source": "ctx.location = params[ctx.plz];",
"params": {
"12345": {"lat": 42.36, "lon": 7.33}
}
}
}
]
}
最终,您的文档将如下所示,您将能够利用 Kibana 可视化中的 location
字段:
{
"message": """[fooServiceClient#doStuff] {"somekey":"somevalue", "multivalue-key": {"plz":"12345", "foo": "bar"}, "someotherkey":"someothervalue"}""",
"plz": "12345",
"location": {
"lat": 42.36,
"lon": 7.33
}
}
总而言之,归结为两件事:
- 创建一个摄取管道以在文档被编入索引时对其进行解析
- 为所有
project*
个索引创建一个索引模板,这些索引的设置包括在步骤 1 中创建的管道
我有一个带有 EFK 堆栈的 OKD 集群设置用于日志记录,如 here 所述。我以前从未使用过其中一个组件。
一个部署记录包含我感兴趣的特定值的请求。我想仅提取此值并使用 Kibana 中显示请求数量及其来源的区域地图将其可视化。
message
字段的内容基本上是这样的:
[fooServiceClient#doStuff] {"somekey":"somevalue", "multivalue-key": {"plz":"12345", "foo": "bar"}, "someotherkey":"someothervalue"}
这个 plz
是德国邮政编码,我想按照描述对其进行可视化。
我的问题是我不知道如何提取这个值。
如果我能用正则表达式找到它,那将是一个很好的第一次成功,但 Kibana 似乎并不像我想的那样工作。按照它的文档,我希望这个 /\"plz\":\"[0-9]{5}\"/
能给我结果,但我得到 0 次点击(时间间隔设置正确)。即使这个正则表达式匹配,我也只会找到包含它的日志条目,而不仅仅是特定的值。我该如何继续?
我想我还需要一个外部地理编码服务,但我应该在什么时候包括它?或者 Kibana 本身知道如何将邮政编码映射到几何图形吗?
初学者友好的分步指南将是完美的,但我可以接受一些指导我的提示。
当文档被索引到 ES 时,可以使用 ingest pipeline with grok processor.
解析message
字段
首先,像这样创建摄取管道:
PUT _ingest/pipeline/parse-plz
{
"processors": [
{
"grok": {
"field": "message",
"patterns": [
"%{POSINT:plz}"
]
}
}
]
}
然后,当您为数据编制索引时,您只需引用该管道:
PUT plz/_doc/1?pipeline=parse-plz
{
"message": """[fooServiceClient#doStuff] {"somekey":"somevalue", "multivalue-key": {"plz":"12345", "foo": "bar"}, "someotherkey":"someothervalue"}"""
}
你最终会得到一个如下所示的文档,它现在有一个名为 plz
的字段,其中包含 12345
值:
{
"message": """[fooServiceClient#doStuff] {"somekey":"somevalue", "multivalue-key": {"plz":"12345", "foo": "bar"}, "someotherkey":"someothervalue"}""",
"plz": "12345"
}
从 Fluentd 索引文档时,您可以在配置中 specify a pipeline to be used。如果您不能或不想修改您的 Fluentd 配置,您还可以为您的索引定义一个默认管道,该管道将在每次为新文档编制索引时启动。只需 运行 在您的索引上,您在索引文档时不需要指定 ?pipeline=parse-plz
:
PUT index/_settings
{
"index.default_pipeline": "parse-plz"
}
如果您有多个索引,更好的方法可能是定义一个 index template,这样每当创建一个名为 project.foo
-something 的新索引时,就会应用这些设置:
PUT _template/project-indexes
{
"index_patterns": ["project.foo*"],
"settings": {
"index.default_pipeline": "parse-plz"
}
}
现在,为了在地图上绘制该 PLZ,您首先需要找到一个数据集,为您提供每个 PLZ 的地理位置。
然后您可以在管道中添加第二个处理器,以便执行 PLZ/ZIP 到纬度、经度的映射:
PUT _ingest/pipeline/parse-plz
{
"processors": [
{
"grok": {
"field": "message",
"patterns": [
"%{POSINT:plz}"
]
}
},
{
"script": {
"lang": "painless",
"source": "ctx.location = params[ctx.plz];",
"params": {
"12345": {"lat": 42.36, "lon": 7.33}
}
}
}
]
}
最终,您的文档将如下所示,您将能够利用 Kibana 可视化中的 location
字段:
{
"message": """[fooServiceClient#doStuff] {"somekey":"somevalue", "multivalue-key": {"plz":"12345", "foo": "bar"}, "someotherkey":"someothervalue"}""",
"plz": "12345",
"location": {
"lat": 42.36,
"lon": 7.33
}
}
总而言之,归结为两件事:
- 创建一个摄取管道以在文档被编入索引时对其进行解析
- 为所有
project*
个索引创建一个索引模板,这些索引的设置包括在步骤 1 中创建的管道