ELK - 具有多种格式和多行事件的不规则日志

时间:2016-09-06 13:53:48

标签: elasticsearch logstash elastic-stack logstash-grok

我有来自某些通信设备的事件跟踪/日志(以"消息"的形式)。我的最终目标是能够(接近)实时监控和分析来自设备的数据流。

跟踪是设备内部操作的转储,包含多种类型的事件,其中一些事件跨越多个"消息" - 我现在正在解析一个文件(所以处理行)但最终将解析stdin或某种流。

我希望每小时能收到大约300万条消息,并且有几台这样的设备需要监控。

我目前面临两个挑战(刚刚开始: - ):

多封邮件

某些消息会显示一些事件。

  • 相关消息不一定是连续的。
  • 通常,第一条消息将告诉事件是分段的,要预期的段数,并包括事件标识符(键)。
  • 其余的段具有相同的事件标识符
  • 分段标头和其他段具有自己的前导码/类型标识符
  • 分段消息只是&#34; cut&#34;在中间并继续下一条消息。例如,"<key xyz part 1> ... 12345",然后是 "<key xyz part 2> 67890 ..."

多种事件类型(&#34;不规则&#34;内容)

  • 有几种类型的事件(20到50个概率)

  • 每个活动的内容都不同。

  • 事件的文字似乎没有遵循任何&#34;固定的&#34;图案。它似乎包含自由文本,键值对&#34; =&#34;分隔符和键值对与&#34;:&#34;分隔器。这里唯一可能有帮助的是&#34;字段&#34; (如果你可以打电话给他们)通常由&#34;;&#34;分开。

  • 某些领域甚至没有价值观。

  • (我不是100%肯定但是)似乎有效负载(在字段方面)甚至可以在同一消息类型中改变。

一些例子(我&#34;混淆&#34;)

  

[2016-08-11 11:47:44.340] [011400 \ 00] 1 / RncLmUePT(1 / someResource [209])../ filename.cpp:335 INFO:some_signal_name信号在胶囊名称中收到@OfSomething @ someResource in state SomeEventName。这表示在AnotherPlace中有一个TYPE_OF_EXEPTION。

或者这5条消息,这是多消息事件的一个例子。注意最后一条消息的不规则性(它开始略有不同),第3和第4条消息被剪切,#34;句子中间&#34;

  

[2016-08-11 11:47:44.340] [021100 \ 01] 2 / PdcLmPrPT somefile.cc:172 INFO:&lt;密钥000001216649856的分段跟踪,4个部分将遵循&gt;

     

[2016-08-11 11:47:44.340] [021100 \ 01] 2 / PdcLmPrPT somefile.cc:179 INFO:&#34; ExceptionCode = 521; TIMER somename已过期; InterfaceTimout(内部); Ueh; SomeCrypticName;对连接没有影响; callProc = ProcedureNameX; DeviceRef = 2060; CLIENT_CODE = UNDEF; CLIENT_CODE2 = 1424514436 [0x54e85d84]; devId = 33456; devFroId = 871; prDevId = UNDEF; prDevFroId = UNDEF; spId = tc:p:225:1; typeModId = 20; &#34;

     

[2016-08-11 11:47:44.340] [021100 \ 01] 2 / PdcLmPrPT somefile.cc:179 INFO:&#34; S-RNFF = 377540; causecode = UNDEF;没有收到SOMETHING; sourceType = devNoValid; sPJK = 000000000000000000000000; targetType = someConnType; sPJK = 000000000000000000000000; UE Cap = Rel9-00000000000000000000000000000010; fileName = ../anotherFileName.cpp;line = 9031; previous state = someStateName; current state =&#34;

     

[2016-08-11 11:47:44.340] [021100 \ 01] 2 / PdcLmPrPT somefile.cc:179 INFO:&#34; WaitSomeOtherState; noOfSomeConnectionState = 459; noOfSomeResUsage = 598; ActiveDevId = [6548,-1,-1,-1,-1]; ActiveDevFroId = [871,-1,-1,-1,-1]; raTimerStatus = 0; raLaxTimerStatus = 0; procedureTriggerReason = someTypeOfRequest; lastGrabRule = NameOfGrabRule;加法文本= EstablishmentCau&#34;

     

[2016-08-11 11:47:44.340] [021100 \ 01] 2 / PdcLmPrPT(2 / SOME_EXCEPTION)../ dififferentFile.cpp:4610 TRACE1:&#34; se是注册(12)。收到PPT连接设置完成或POMP链路恢复指示。 &#34;

我想把这些数据放到Elastic Search for visualization(kibana)等中,我不确定logstash是否是工作的工具(或者至少是现有的编解码器/插件/过滤器)。 我很乐意听到其他/更好的框架

从我到目前为止所阅读/理解的内容,了解更多&#34;常规&#34;数据我使用多线编解码器和grok过滤器和简单的弹性输出插件,但在这里我没有看到这些工具是一个可行的选择。 (我的评估是否正确?)

我想到的可能是尝试自己编写一些logstash插件或使用独立程序处理跟踪。

我是如何使用现有工具的想法或想法,或者,对于这种情况,什么是一个好方法?

P.S。我没有使用Ruby的经验,但对java / js / python和.NET(C#)非常流利

P.S.2我不是100%锁定在ELK上。这似乎是这项工作最常用的工具之一。我也考虑将TSDB甚至列/文档DB作为选项。

2 个答案:

答案 0 :(得分:0)

由于多行消息不是连续的,因此您将不得不编写某种状态解析器来确定如何将消息拼接在一起。如果它是顺序的,你可以使用logstash grok模式来确定每条消息的开头和结尾。

另一种方法是简单地使用grok模式来提取消息id并将其作为属性添加到日志消息中。然后,您将在Elasticsearch中获得单独的消息。但是,在您的Kibana仪表板中,您可以轻松地将搜索限制为消息ID,以获取与消息ID相关的所有事件。这可能足以满足您的目的。

答案 1 :(得分:0)

您可以编写一个ruby过滤器,它执行grep / sed / awk的组合以从输入文件中获取所需的数据并将该数据保存为事件。这里的缺点是,你需要在内存中保留一个文件来执行操作。

过滤器 {

 ruby {
code => 'require "open3"
         file_path = event.get("file_path")
         cmd =  "my_filter.sh -f #{file_path}"
         stdin, stdout, stderr = Open3.popen3(cmd)
         event.set("process_result", stdout.read)
         err = stderr.read
         if err.to_s.empty?
           filter_matched(event)
         else
           event.set("ext_script_err_msg", err)
         end'
  remove_field => ["file_path"]

}    }