使用 Grok 抓取多行

Grabbing multiple lines using Grok

以下是我需要使用 logstash 和 logstash grok 过滤器解析的日志示例:

2018-02-12 15:17:39.216 [DEBUG] [    60] [CashTransactionReportCommand] [4564 456] - Xml of valid cash: <NewDataSet>
  <Table>
    <transaction_id>546464</transaction_id>
    <device_trans_id>24</device_trans_id>
    <value>3.5000</value>
    <product_code>40</product_code>
    <product_pa_code>E1</product_pa_code>
    <catalog_number />
    <decimal_place>2</decimal_place>
    <site_id>2</site_id>
    <machineSeTime>2018-02-12T17:17:39.273+00:00</machineSeTime>
    <payment_method_id>3</payment_method_id>
    <actor_id>4566</actor_id>
    <operator_id>55</operator_id>
  </Table>
</NewDataSet>

我几乎拥有我需要的一切:

%{TIMESTAMP_ISO8601:log_timestamp} \[%{LOGLEVEL:loglevel}\] \[%{DATA:snId}\] \[%{WORD:snName}\] (?<test>\[\d+ \d+\]) %{GREEDYDATA:logmessage}

我唯一的问题是 "logmessage"。我需要它包含通过“[4564 456]”直到示例结束的所有内容。

为了能够解析消息,包括 XML,您必须将所有行分组在同一个 logstash 事件中,以便在使用 grok 过滤器时,消息字段包含整个消息。可以这样做:

  • 在带有多行编解码器的 logstash 中

Multiline codec documentation

  • 在带有多行选项的 filebeat 中

Documentation of multiline option in filebeat configuration