我设置了 logstash 来读取 XML 文件。它确实这样做了,但它不会将输出打印到标准输出,直到我退出应用程序 (ctrl+c)。然后打印出它所解释的正确结构:
.conf:
input {
file {
path => "C:/Projects/Python Projects/SolAdmin/SolAdmin/ClientConnectionsWide_*.xml"
start_position => beginning
ignore_older => 0
sincedb_path => "C:/Projects/Elastic Stack/logstash-2.3.4/logstash-2.3.4/sincedb"
codec => multiline {
pattern => "^<rpc-reply.*\>"
negate => true
what => "previous"
}
}
}
filter {
grok {
match => { "message" => "%{GREEDYDATA:xmldata}" }
}
xml {
source => "xmldata"
store_xml => "false"
xpath => [
"rpc-reply/rpc/show/client/client/connection/foreign-address/text()", "client_ip",
"rpc-reply/rpc/show/client/client/connection/round-trip-time-smooth-us/text()", "smooth_round_trip"
]
}
}
output {
stdout {
codec => rubydebug
}
}
.xml:
<rpc-reply semp-version="soltr/7_1_1">
<rpc>
<show>
<client>
<client>
<name>BSPFODS0914/6548/#00000001</name>
<message-vpn>fod_prod</message-vpn>
<connection>
<protocol>tcp</protocol>
<is-zip>false</is-zip>
<is-ssl>false</is-ssl>
<receive-queue-bytes>0</receive-queue-bytes>
<receive-queue-segments>0</receive-queue-segments>
<send-queue-bytes>0</send-queue-bytes>
<send-queue-segments>0</send-queue-segments>
<local-address>10.137.4.211:55555</local-address>
<foreign-address>10.134.100.72:52974</foreign-address>
<state>ESTABLISHED</state>
<maximum-segment-size>1460</maximum-segment-size>
<bytes-sent-32bits>52206343</bytes-sent-32bits>
<bytes-received-32bits>6779578</bytes-received-32bits>
<retransmit-time-ms>278.567</retransmit-time-ms>
<round-trip-time-smooth-us>737.83</round-trip-time-smooth-us>
<round-trip-time-minimum-us>584.758</round-trip-time-minimum-us>
<round-trip-time-variance-us>60.759</round-trip-time-variance-us>
<advertised-window-size>262144</advertised-window-size>
<transmit-window-size>149116</transmit-window-size>
<bandwidth-window-size>22617</bandwidth-window-size>
<congestion-window-size>131072</congestion-window-size>
<slow-start-threshold-size>262144</slow-start-threshold-size>
<segments-received-out-of-order>0</segments-received-out-of-order>
<fast-retransmits>0</fast-retransmits>
<timed-retransmits>60</timed-retransmits>
<connection-uptime-s>16886</connection-uptime-s>
<blocked-cycles-percent>0</blocked-cycles-percent>
<interface>1/6/1</interface>
</connection>
</client>
</client>
</show>
</rpc>
<execute-result code="ok"/>
</rpc-reply>
结果:
C:\Projects\Elastic Stack\logstash-2.3.4\logstash-2.3.4>bin\logstash -f config\Config.conf
Using JAVA_HOME=C:\Program Files (x86)\Java\jre1.8.0_91 retrieved from C:\ProgramData\Oracle\java\javapath\java.exe
io/console not supported; tty will not be manipulated
Settings: Default pipeline workers: 8
Pipeline main started
←[33mSIGINT received. Shutting down the agent. {:level=>:warn}←[0m
stopping pipeline {:id=>"main"}
{
"@timestamp" => "2016-07-26T15:27:43.866Z",
"message" => "<rpc-reply semp-version=\"soltr/7_1_1\">\r\n <rpc>\r\n <show>\r\n <client>\r\n <client>\r\n <name>BSPFODS0
"@version" => "1",
"tags" => [
[0] "multiline"
],
"path" => "C:/Projects/Python Projects/SolAdmin/SolAdmin/ClientConnectionsWide_20160726-131028.xml",
"host" => "CP-FOD-110805",
"xmldata" => "<rpc-reply semp-version=\"soltr/7_1_1\">\r\n <rpc>\r\n <show>\r\n <client>\r\n <client>\r\n <name>BSPFODS0
"client_ip" => [
[0] "10.134.100.72:52974"
],
"smooth_round_trip" => [
[0] "737.83"
]
}
最佳答案
codec-multiline 一直在等待下一行来检查它是否属于上一行。在 what = "next" 的情况下,它会一直等待下一行将当前行附加到它。所以基本上在任何情况下它都会一直等待下一行,因此日志中的最后一行永远不会刷新到输出中。
此问题已在此处报告:https://github.com/elastic/logstash/issues/4567
这个问题的解决方案已经在Logstash >= 2.1中定义。 codec-multiline 的 auto_flush_interval 属性可用于在一定时间间隔后刷新输出。
您可以按如下方式修改您的配置:
codec => multiline {
pattern => "^<rpc-reply.*\>"
negate => true
what => "previous"
auto_flush_interval => 5
}
在配置中进行此修改后,logstash 现在将等待 5 秒,然后清除所有剩余的行以进行输出。
auto_flush_interval 没有默认值,因此您必须明确指定它才能从 Logstash 获得此行为。
我在 Logstash 2.3 上对其进行了测试,它对我有效。希望对你也有帮助!
关于xml - 在我 CTRL-C 之前,logstash 不打印输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38607692/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][
我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser
我想使用spawn(针对多个并发子进程)在Ruby中执行一个外部进程,并将标准输出或标准错误收集到一个字符串中,其方式类似于使用Python的子进程Popen.communicate()可以完成的操作。我尝试将:out/:err重定向到一个新的StringIO对象,但这会生成一个ArgumentError,并且临时重新定义$stdxxx会混淆子进程的输出。 最佳答案 如果你不喜欢popen,这是我的方法:r,w=IO.pipepid=Process.spawn(command,:out=>w,:err=>[:child,:out])
我想知道Ruby用来在命令行打印这些东西的输出流:irb(main):001:0>a="test"=>"test"irb(main):002:0>putsatest=>nilirb(main):003:0>a=>"test"$stdout是否用于irb(main):002:0>和irb(main):003:0>?而且,在这两次调用之间,$stdout的值是否有任何变化?另外,有人能告诉我打印/写入这些内容的Ruby源代码吗? 最佳答案 是的。而且很容易向自己测试/证明。在命令行试试这个:ruby-e'puts"foo"'>test.
我在使用自定义RailsFormBuilder时遇到了问题,从昨天晚上开始我就发疯了。基本上我想对我的构建器方法之一有一个可选block,以便我可以在我的主要content_tag中显示其他内容。:defform_field(method,&block)content_tag(:div,class:'field')doconcatlabel(method,"Label#{method}")concattext_field(method)capture(&block)ifblock_given?endend当我在我的一个Slim模板中调用该方法时,如下所示:=f.form_field:e
我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?
在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.