草庐IT

xml - 在我 CTRL-C 之前,logstash 不打印输出

coder 2024-06-30 原文

我设置了 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-multilineauto_flush_interval 属性可用于在一定时间间隔后刷新输出。

您可以按如下方式修改您的配置:

codec => multiline {
        pattern => "^<rpc-reply.*\>"
        negate => true
        what => "previous"
        auto_flush_interval => 5
    }

在配置中进行此修改后,logstash 现在将等待 5 秒,然后清除所有剩余的行以进行输出。

auto_flush_interval 没有默认值,因此您必须明确指定它才能从 Logstash 获得此行为。

我在 Logstash 2.3 上对其进行了测试,它对我有效。希望对你也有帮助!

引用:codec-multiline-auto_flush_interval

关于xml - 在我 CTRL-C 之前,logstash 不打印输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38607692/

有关xml - 在我 CTRL-C 之前,logstash 不打印输出的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  3. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  4. ruby - 如何进行排列以有效地定制输出 - 2

    这是一道面试题,我没有答对,但还是很好奇怎么解。你有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][

  5. ruby - 如何在 Rails 4 中使用表单对象之前的验证回调? - 2

    我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务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

  6. ruby - 将 spawn() 的标准输出/标准错误重定向到 Ruby 中的字符串 - 2

    我想使用spawn(针对多个并发子进程)在Ruby中执行一个外部进程,并将标准输出或标准错误收集到一个字符串中,其方式类似于使用Python的子进程Popen.communicate()可以完成的操作。我尝试将:out/:err重定向到一个新的StringIO对象,但这会生成一个ArgumentError,并且临时重新定义$stdxxx会混淆子进程的输出。 最佳答案 如果你不喜欢popen,这是我的方法:r,w=IO.pipepid=Process.spawn(command,:out=>w,:err=>[:child,:out])

  7. ruby - Ruby 是否使用 $stdout 来写入 puts 和 return 的输出? - 2

    我想知道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.

  8. ruby-on-rails - 无法在 Rails 助手中捕获 block 的输出 - 2

    我在使用自定义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

  9. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  10. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

随机推荐