騎驢去看海 發表於 2023-9-24 00:00:00

ELK logstash 处理多行事件(25th)

<p>有些日志是分多行输出的,为了能正确的处理这些多行的事件,logstash必须哪些行是单一事件的一部分。多行事件处理是比较复杂的,需依赖正确的事件顺序。最佳方法是尽早的在管道中处理以保证日志有序。这就是本文要说到的logstash管道multiline codec,专门来处理合并多行事件的。</p>
<p>multiline插件最重要的方面:</p>
<ul class="itemizedlist" type="disc">
<li class="listitem"> <code class="literal">pattern</code> 选项指定一个正则表达式。 事件匹配指定的正则表达式来确定是前一个事件的内容还是新的事件的内容。可以使用grok正则表达式的模板来配置该选项。</li>
<li class="listitem"> <code class="literal">what</code> 选项有两个选择值:<code class="literal">previous</code> 或者 <code class="literal">next。</code><code class="literal">previous</code> 值指定行匹配pattern选项的内容是上一行的一部分。 <code class="literal">next</code> 指定行匹配pattern选项的内容是下一行的一部分。* <code class="literal">negate选项适用于</code> multiline codec 行不匹配pattern选项指定的正则表达式。</li>
</ul>
<p>了解更多还需要看看multiline codec 和 multiline filter 插件的配置项。</p>
<p>下面介绍三个例子:</p>
<ul>
<li>java 堆栈跟踪单个事件</li>
<li>C-style 线连续成单个事件</li>
<li>从时间标记事件</li>
</ul>
<h4>java stack traces</h4>
<p>Java stack traces  包含多行内容,后面几行与初始行缩进,如下所示:</p><pre class="brush:bash;toolbar:false">Exception in thread "main" java.lang.NullPointerException
      at com.example.myproject.Book.getTitle(Book.java:16)
      at com.example.myproject.Author.getBookTitles(Author.java:25)
      at com.example.myproject.Bootstrap.main(Bootstrap.java:14)</pre><p>logstash配置如下:</p><pre class="brush:bash;toolbar:false">input {
stdin {
    codec =&gt; multiline {
      pattern =&gt; "^\s"
      what =&gt; "previous"
    }
}
}</pre><p>该配置将任何以空白开始的行与上一行合并。</p>
<p>输出的结果如下:</p><pre class="brush:bash;toolbar:false">{
    "@timestamp" =&gt; "2015-12-11T07:32:20.872Z",
       "message" =&gt; "Exception in thread \"main\" java.lang.NullPointerException\n      at com.example.myproject.Book.getTitle(Book.java:16)\n      at com.example.myproject.Author.getBookTitles(Author.java:25)\n      at com.example.myproject.Bootstrap.main(Bootstrap.java:14)Settings: Default filter workers: 4",
      "@version" =&gt; "1",
          "tags" =&gt; [
       "multiline"
    ],
          "host" =&gt; "localhost"
}</pre><p></p>
<h4>line continuations</h4>
<p>多种编程语言使用\字符在一行末尾表示该行继续,如:</p><pre class="brush:bash;toolbar:false">printf ("%10.10ld\t %10.10ld \t %s\
%f", w, x, y, z );</pre><p>logstash配置如下:</p><pre class="brush:bash;toolbar:false">input {
stdin {
    codec =&gt; multiline {
      pattern =&gt; "\\$"
      what =&gt; "next"
    }
}
}</pre><p>该配置将以\字符结尾的任何行合并到下一行。</p>
<p>输出的结果如下:</p><pre class="brush:bash;toolbar:false">{
    "@timestamp" =&gt; "2015-12-11T07:46:02.116Z",
       "message" =&gt; "printf (\"%10.10ld\\t %10.10ld \\t %s\\\n%f\", w, x, y, z );",
      "@version" =&gt; "1",
          "tags" =&gt; [
       "multiline"
    ],
          "host" =&gt; "localhost"
}</pre><p></p>
<h4>timestamps</h4>
<p>有些日志是以时间戳开始的,如:</p><pre class="brush:bash;toolbar:false"> using data paths, mounts [[/
(/dev/disk1)]], net usable_space , net total_space , types </pre><p>logstash配置如下:</p><pre class="brush:bash;toolbar:false">input {
stdin {
    codec =&gt; multiline {
      pattern =&gt; "^%{TIMESTAMP_ISO8601} "
      negate =&gt; true
      what =&gt; previous
    }
}
}</pre><p>该配置使用negate =&gt; true 选项来指定任何不是以时间戳开始的行属于前行。也就是不匹配pattern的行都属于前行的内容的一部分。</p>
<p>输出的结果如下:</p><pre class="brush:bash;toolbar:false">{
    "@timestamp" =&gt; "2015-12-11T08:08:37.013Z",
       "message" =&gt; " using data paths, mounts [[/\n(/dev/disk1)]], net usable_space , net total_space , types ",
      "@version" =&gt; "1",
          "tags" =&gt; [
       "multiline"
    ],
          "host" =&gt; "localhost"
}</pre><p>后面看应用处理mysql慢查询日志。</p>
頁: [1]
查看完整版本: ELK logstash 处理多行事件(25th)