Logstash字段拆分并合并

时间:2018-11-22 12:37:37

标签: plugins logstash cisco mutate

一个月前,我开始在我工作的IT公司中作为个人项目使用和配置ELK堆栈。

我的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”字段中删除数字,使其成为“直径错误”

为什么?我想使用该字段中的数据创建可视化饼图,而数字对我而言绝对无关紧要。不仅如此,它还创建了数千个

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文件。 对于我的问题或配置中的任何行的任何帮助和建议都将受到欢迎!

1 个答案:

答案 0 :(得分:1)

您快到了。您所需要做的就是使用mutate / replace合并所需的数据,并使用mutate / remove_filed删除不必要的字段。

您需要将ASR_INSTANCE_LVL字段名称更改为级别,因为您已经具有级别字段。假设您将其称为asr_level。

在conf文件末尾添加相关的变异。

mutate {
   replace => [ "instance_info", "%{instance_info} %{asr_level}" ]
}
 mutate {
   remove_field => ["asr_level", "nr"]
}

您可以查看此google forumhttps://discuss.elastic.co/t/want-to-combine-field-values-into-new-field-value/28564以获得更多详细信息。

祝你好运