Logstash 字段拆分与合并
Logstash Field split and merge
我一个月前开始使用和配置 ELK 堆栈,作为我工作的 IT 公司的个人项目。
没有任何培训或编码背景,我的 Logstash 工作得很好,可以接受来自 StarOS 和一些 IOS 设备上的 Cisco ASR5K 的日志,将它们发送到 Elasticsearch 并以 RAW 格式存储它们。
我现在正在尝试调整我为此配置创建的字段,但遇到了一些困难,所以我真的希望你能帮助我。欢迎任何反馈。
好的,所以我的问题如下:
我有一个 RAW 格式的日志
<171>Nov 13 18:11:03 evlogd: [local-60sec3.378] [diameter 92004 error] [8/0/6001 <diactrl:0> flow_id_mgmt.c:743] [software internal system syslog] Flow ID sync with facility 87000 instance 377 failed 82649 times
并且我应用了以下匹配项
%{ASR_TIMESTAMP:log_date} %{ASR_TASK:task} \[%{ASR_FACILITY:facility}\] \[%{ASR_INSTANCE:instance_info}\] \[%{ASR_MGR:mgr}\] \[%{ASR_LEVEL:level}\] %{ASR_RAW:message}
使用以下自定义模式:
CISCOTIMESTAMPTZ %{CISCOTIMESTAMP}( %{TZ})?
NEXUSTIMESTAMP %{YEAR} %{MONTH} %{MONTHDAY} %{TIME}( %{TZ})?
ASR_TIMESTAMP %{MONTH} %{MONTHDAY} %{TIME}
ASR_TASK %{DATA}
ASR_FACILITY %{DATA}
ASR_EVENT_ID %{DATA}
ASR_LEVEL %{DATA}
ASR_EVENT_LEVEL %{WORD}
ASR_INSTANCE %{DATA}
ASR_CONTEXT %{DATA}
ASR_EVENT %{WORD}
ASR_TYPE %{DATA}
ASR_MGR %{DATA}
ASR_RAW %{GREEDYDATA}
ASR_CALLID %{DATA}
而且一切正常(好吧,至少对我而言)。日志是匹配的,所以这是一个好的开始。
{
"log_date" => "Nov 15 13:20:07",
--
"hostname" => "MM-MME",
"fingerprint" => "9414227242b545335cb679d9905dddf6b8976cf2",
"task" => "evlogd:",
"level" => "software internal system syslog",
"host" => "X.X.X.X",
"mgr" => "8/0/6001 <diactrl:0> flow_id_mgmt.c:743",
"message" => "Flow ID sync with facility 87000 instance 75 failed 83718 times\u0000",
"@timestamp" => 2018-11-15T11:20:07.439Z,
"instance_info" => "diameter 92004 error",
"facility" => "local-60sec7.199",
"type" => "syslog-cisco"
}
我想要的是从 "instance_info" 字段中删除数字,使其成为 "diameter error"
为什么?我想用这个领域的数据创建一个可视化饼图,数字与我完全无关。不仅如此,它通过创建 thousands of:
搞砸了我的饼图
sessmgr 10033 trace
sessmgr 10036 trace
sctp 87304 error
sgsn-gtpc 116043 debug
sessmgr 12902 debug
sgs 173002 debug
nas 153002 debug
sgs 173001 debug
sgsn-gtpc 116004 debug
sessmgr 12093 error
sgsn-gtpc 116003 debug
sgsn-gtpc 116094 info
sgsn-gtpc 116095 info
sgsn-gtpc 116120 debug
sgsn-gtpc 116122 debug
sgsn-gtpc 116057 debug
sessmgr 10177 debug
sessmgr 10207 info
sessmgr 10285 debug
aaamgr 36861 debug
sessmgr 10004 info
sessmgr 10738 trace
sessmgr 12952 info
aaa-client 6002 debug
aaa-client 6003 debug
应该有大约 15-20 个结果,例如:
sgsn-gtpc info/debug etc
sessmgr info/debug/error etc
aaamgr info/debug/error etc
我根据以下行动计划进行了尝试:
拆分 "instance_info" 介绍 3 个字段:
ASR_INSTANCE %{WORD}
ASR_INSTANCE_NR %{NUMBER}
ASR_INSTANCE_LVL %{WORD}
并创建一个新的匹配项:
%{ASR_TIMESTAMP:log_date} %{ASR_TASK:task} \[%{ASR_FACILITY:facility}\] \[%{ASR_INSTANCE:instance_info}%{SPACE}%{ASR_INSTANCE_NR:nr}%{SPACE}%{ASR_INSTANCE_LVL:Level}\] \[%{ASR_MGR:mgr}\] \[%{ASR_LEVEL:level}\] %{ASR_RAW:message}
哪个有效(在在线 GROK 调试器中测试):
"instance_info": [
[
"diameter"
]
],
"nr": [
[
"92004"
]
],
"Level": [
[
"error"
现在我想删除 "nr" 字段并将 ["instance_info", "Level"] 合并为一个字段。老实说,我不知道该怎么做。
我尝试使用 mutate 插件,但我缺乏了解如何以及在何处插入它的知识。
恳请您在这件事上帮助我或提出不同的建议。
配置文件:01-cisco.conf
我知道对于你们大多数人来说,我的配置文件可能看起来非常令人毛骨悚然,但这是我能做的最好的,所以请不要评判我的 frankenstein.conf 文件。
欢迎对我的问题或配置中的任何行提供任何帮助和建议!
你快到了。您所要做的就是使用 mutate/replace to combine the data you need and mutate/remove_filed 删除不必要的字段。
您需要将 ASR_INSTANCE_LVL 字段名称 而不是 更改为级别,因为您已经有了级别字段。假设您将其命名为 asr_level.
在您的 conf 文件末尾添加相关的 mutate。
mutate {
replace => [ "instance_info", "%{instance_info} %{asr_level}" ]
}
mutate {
remove_field => ["asr_level", "nr"]
}
您可以查看此google forum and https://discuss.elastic.co/t/want-to-combine-field-values-into-new-field-value/28564了解更多详情。
祝你好运
我一个月前开始使用和配置 ELK 堆栈,作为我工作的 IT 公司的个人项目。
没有任何培训或编码背景,我的 Logstash 工作得很好,可以接受来自 StarOS 和一些 IOS 设备上的 Cisco ASR5K 的日志,将它们发送到 Elasticsearch 并以 RAW 格式存储它们。
我现在正在尝试调整我为此配置创建的字段,但遇到了一些困难,所以我真的希望你能帮助我。欢迎任何反馈。
好的,所以我的问题如下: 我有一个 RAW 格式的日志
<171>Nov 13 18:11:03 evlogd: [local-60sec3.378] [diameter 92004 error] [8/0/6001 <diactrl:0> flow_id_mgmt.c:743] [software internal system syslog] Flow ID sync with facility 87000 instance 377 failed 82649 times
并且我应用了以下匹配项
%{ASR_TIMESTAMP:log_date} %{ASR_TASK:task} \[%{ASR_FACILITY:facility}\] \[%{ASR_INSTANCE:instance_info}\] \[%{ASR_MGR:mgr}\] \[%{ASR_LEVEL:level}\] %{ASR_RAW:message}
使用以下自定义模式:
CISCOTIMESTAMPTZ %{CISCOTIMESTAMP}( %{TZ})?
NEXUSTIMESTAMP %{YEAR} %{MONTH} %{MONTHDAY} %{TIME}( %{TZ})?
ASR_TIMESTAMP %{MONTH} %{MONTHDAY} %{TIME}
ASR_TASK %{DATA}
ASR_FACILITY %{DATA}
ASR_EVENT_ID %{DATA}
ASR_LEVEL %{DATA}
ASR_EVENT_LEVEL %{WORD}
ASR_INSTANCE %{DATA}
ASR_CONTEXT %{DATA}
ASR_EVENT %{WORD}
ASR_TYPE %{DATA}
ASR_MGR %{DATA}
ASR_RAW %{GREEDYDATA}
ASR_CALLID %{DATA}
而且一切正常(好吧,至少对我而言)。日志是匹配的,所以这是一个好的开始。
{
"log_date" => "Nov 15 13:20:07",
--
"hostname" => "MM-MME",
"fingerprint" => "9414227242b545335cb679d9905dddf6b8976cf2",
"task" => "evlogd:",
"level" => "software internal system syslog",
"host" => "X.X.X.X",
"mgr" => "8/0/6001 <diactrl:0> flow_id_mgmt.c:743",
"message" => "Flow ID sync with facility 87000 instance 75 failed 83718 times\u0000",
"@timestamp" => 2018-11-15T11:20:07.439Z,
"instance_info" => "diameter 92004 error",
"facility" => "local-60sec7.199",
"type" => "syslog-cisco"
}
我想要的是从 "instance_info" 字段中删除数字,使其成为 "diameter error"
为什么?我想用这个领域的数据创建一个可视化饼图,数字与我完全无关。不仅如此,它通过创建 thousands of:
搞砸了我的饼图sessmgr 10033 trace
sessmgr 10036 trace
sctp 87304 error
sgsn-gtpc 116043 debug
sessmgr 12902 debug
sgs 173002 debug
nas 153002 debug
sgs 173001 debug
sgsn-gtpc 116004 debug
sessmgr 12093 error
sgsn-gtpc 116003 debug
sgsn-gtpc 116094 info
sgsn-gtpc 116095 info
sgsn-gtpc 116120 debug
sgsn-gtpc 116122 debug
sgsn-gtpc 116057 debug
sessmgr 10177 debug
sessmgr 10207 info
sessmgr 10285 debug
aaamgr 36861 debug
sessmgr 10004 info
sessmgr 10738 trace
sessmgr 12952 info
aaa-client 6002 debug
aaa-client 6003 debug
应该有大约 15-20 个结果,例如:
sgsn-gtpc info/debug etc
sessmgr info/debug/error etc
aaamgr info/debug/error etc
我根据以下行动计划进行了尝试: 拆分 "instance_info" 介绍 3 个字段:
ASR_INSTANCE %{WORD}
ASR_INSTANCE_NR %{NUMBER}
ASR_INSTANCE_LVL %{WORD}
并创建一个新的匹配项:
%{ASR_TIMESTAMP:log_date} %{ASR_TASK:task} \[%{ASR_FACILITY:facility}\] \[%{ASR_INSTANCE:instance_info}%{SPACE}%{ASR_INSTANCE_NR:nr}%{SPACE}%{ASR_INSTANCE_LVL:Level}\] \[%{ASR_MGR:mgr}\] \[%{ASR_LEVEL:level}\] %{ASR_RAW:message}
哪个有效(在在线 GROK 调试器中测试):
"instance_info": [
[
"diameter"
]
],
"nr": [
[
"92004"
]
],
"Level": [
[
"error"
现在我想删除 "nr" 字段并将 ["instance_info", "Level"] 合并为一个字段。老实说,我不知道该怎么做。 我尝试使用 mutate 插件,但我缺乏了解如何以及在何处插入它的知识。
恳请您在这件事上帮助我或提出不同的建议。 配置文件:01-cisco.conf
我知道对于你们大多数人来说,我的配置文件可能看起来非常令人毛骨悚然,但这是我能做的最好的,所以请不要评判我的 frankenstein.conf 文件。 欢迎对我的问题或配置中的任何行提供任何帮助和建议!
你快到了。您所要做的就是使用 mutate/replace to combine the data you need and mutate/remove_filed 删除不必要的字段。
您需要将 ASR_INSTANCE_LVL 字段名称 而不是 更改为级别,因为您已经有了级别字段。假设您将其命名为 asr_level.
在您的 conf 文件末尾添加相关的 mutate。
mutate {
replace => [ "instance_info", "%{instance_info} %{asr_level}" ]
}
mutate {
remove_field => ["asr_level", "nr"]
}
您可以查看此google forum and https://discuss.elastic.co/t/want-to-combine-field-values-into-new-field-value/28564了解更多详情。
祝你好运