# 複数行にまたがるログのパースについて

**URL:** https://discuss.elastic.co/t/topic/176846
**Category:** 日本語による質問・議論はこちら
**Created:** [April 15, 2019, 7:22am UTC](https://discuss.elastic.co/t/topic/176846 "2019-04-15T07:22:05Z")
**Posts on this page:** 1
**Showing post:** 2

<div class="post-metadata">

### Author: ![tsgkdt](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/tsgkdt/32/39151_2.png) [@tsgkdt](https://discuss.elastic.co/u/tsgkdt)
#### Post date: [April 15, 2019, 8:48am UTC](https://discuss.elastic.co/t/topic/176846/2 "2019-04-15T08:48:29Z")

</div>

## inputの中身について

まずinputの指定です。

> **[Multiline codec plugin | Logstash Plugins](https://www.elastic.co/docs/reference/logstash/plugins/plugins-codecs-multiline)**
>
> Plugin version: v3.1.2 (Other versions), Released on: 2024-04-25, Changelog. For questions about the plugin, open a topic in the Discuss forums. For bugs...

ここにあります「Another example is to merge lines not starting with a date up to the previous line..」のところが今回のパターンと近しいのでイメージしやすいと思います。

日付の文字列で始まってなかったら、前の行データ(previous)にくっつけていくというサンプルです。

少し上の説明文を見ると、こう書いてあります。

> The `negate` can be `true` or `false` (defaults to `false` ). If `true` , a message not matching the pattern will constitute a match of the multiline filter and the `what` will be applied. (vice-versa is also true)

negateをtrueにしたとき、メッセージがパターンにマッチしなかったら、whatの内容が適用される。  
今回negateはtrueになっているため、日付文字列が入った [ で始まらなかったら、前の行に追加する、 と書けるので、inputはこんな感じにしました。  
nextではなくpreviousにしています。

```rudy

input {
  file {
    path => "Z:/z.log"
    start_position => "beginning"
    codec => multiline {
      pattern => "^\["
      negate => true
      what => "previous"
    }
  }
}

```

## grokの書き方について

おそらく、multilineがうまく設定されていると、logstashのoutputにstdoutを指定しますと、どのようなデータがmessageに入っているかを確認できるかと思います。

改行コードにもよりますが、今回はCRLF（\r\n)で以下のようなテストデータを作りました。

```txt
[2019/04/15 11:19:32] ID=1790 DEV=tokyo.region.04
dir

```

logstashのgrokでは、改行コードも含めてpatternを書きました。

```ruby
filter {
  grok {
    match => { "message" => "\[%{YEAR:year}/%{MONTHNUM:month}/%{MONTHDAY:day}%{SPACE}%{HOUR:hour}:%{MINUTE:minute}:%{SECOND:sec}\] ID=%{POSINT:ID} DEV=%{HOSTNAME:DEV}\r\n%{GREEDYDATA:command}\r" }
    
  }
}

```

とすると、こんな感じでパースできます。

 ![image](https://us1.discourse-cdn.com/elastic/original/3X/e/9/e9d168712e919c690c6e82788618d4f13f200082.png)

messageに入った文字列をみて、Grokのパターンを考えるのがポイントです。

## 参考

Grokのパターンを考える際は、KibanaのDevToolsにあるGrok Debuggerを使うと、簡易に試せて便利です。

 ![Kibana](https://us1.discourse-cdn.com/elastic/original/3X/d/2/d25bbf4c5f40506a9d6bad448eb25122fc594f91.png)

## 参考2

パースする側からしてみると、 [日付]部分がTIMESTAMP\_ISO8601の形式になっていればもっと簡単にGrokのパターンが書けて良さそうです。

これらの中身は、7.0.0の環境で試しています。ご参考になれば幸いです。

---

_[View the full topic](https://discuss.elastic.co/t/topic/176846)._
