我有来自某些通信设备的事件跟踪/日志(以"消息"的形式)。我的最终目标是能够(接近)实时监控和分析来自设备的数据流。
跟踪是设备内部操作的转储,包含多种类型的事件,其中一些事件跨越多个"消息" - 我现在正在解析一个文件(所以处理行)但最终将解析stdin或某种流。
我希望每小时能收到大约300万条消息,并且有几台这样的设备需要监控。
我目前面临两个挑战(刚刚开始: - ):
多封邮件
某些消息会显示一些事件。
"<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作为选项。
答案 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"]
} }