LoginSignup
16
12

More than 5 years have passed since last update.

Filebeatで複数行を扱うMultiline設定まとめ

Last updated at Posted at 2016-07-22

概要

Filebeatにて複数行のメッセージを1イベントとして取り扱うためのMultiline設定をまとめてみました。

公式ドキュメントは下記となります。
https://www.elastic.co/guide/en/beats/filebeat/current/configuration-filebeat-options.html#multiline

環境

Filebeat: v1.2.3

本題に入る前に

Multilineの話をする前に、まずはFilebeatのデフォルトの仕様について整理します。

Filebeatは指定したファイルを読込み、logstashやElasticsearchに情報(イベント)をアウトプットするShipperとなります。
通常、読込みファイルの1行につき1イベントがアウトプットされるため、
連携先のElasticsearchでは読込みファイルの1行が1ドキュメント(RDBでいうところのレコード)として登録されます。

下記のログを取り込んだ場合は合計3ドキュメントが登録される形になります。

[12/May/2014:21:14:56 +0900] "GET /index.html HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0"
[12/May/2014:21:14:59 +0900] "GET /test.html HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0"
[12/May/2014:21:14:51 +0900] "GET /sleep.php HTTP/1.1" 200 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0"

Multilineのユースケース

通常は1行1イベントとして扱うことで何も問題がないのですが、
Javaのスタックトレースのようにメッセージが複数行に渡る場合に、複数行を1イベントとして扱いたい場合があります。
(下記のログメッセージは4ドキュメントではなく1ドキュメントとしてElasticsearchに取り込みたいという具合)

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)

設定項目

Filebeatの設定ファイルである filebeat.ymlmultiline セクションを編集します。

filebeat.yml
      # Mutiline can be used for log messages spanning multiple lines. This is common
      # for Java Stack Traces or C-Line Continuation
      #multiline:

        # The regexp Pattern that has to be matched. The example pattern matches all lines starting with [
        #pattern: ^\[

        # Defines if the pattern set under pattern should be negated or not. Default is false.
        #negate: false

        # Match can be set to "after" or "before". It is used to define if lines should be append to a pattern
        # that was (not) matched before or after or as long as a pattern is not matched based on negate.
        # Note: After is the equivalent to previous and before is the equivalent to to next in Logstash
        #match: after

        # The maximum number of lines that are combined to one event.
        # In case there are more the max_lines the additional lines are discarded.
        # Default is 500
        #max_lines: 500

        # After the defined timeout, an multiline event is sent even if no new pattern was found to start a new event
        # Default is 5s.
        #timeout: 5s

設定項目は下記の通りとなります。

pattern

正規表現パターン

negate

正規表現にマッチするものを扱うか、マッチしないものを扱うか
ture もしくは false を指定(デフォルトは false

match

マッチする行をどのように扱うか
before もしくは after を指定

maxlines

連続する行の最大行数(デフォルトは500)

timeout

連続する行が見つらない場合のタイムアウト値(デフォルトは5s)

具体例

なんとも直観的に分かりづらいですが、 negatematch の組み合わせで挙動が変わるので具体例を交えて説明します。

No negate match 説明
1 false after patternにマッチする連続した行が、前のマッチしない行の後に追加される
2 false before patternにマッチする連続した行が、次のマッチしない行の前に追加される
3 true after patternにマッチしない連続した行が、前のマッチする行の後に追加される
4 true before patternにマッチしない連続した行が、次のマッチする行の前に追加される

例えば下記のようなスタックトレースの全文を1イベントとして扱いたい場合を考えてみましょう。

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)

この場合はNo1の設定を適用することができます。

multiline:
  pattern: '^[[:space:]]'
  negate: false
  match: after

これはpatternにマッチする(先頭がスペースで始まる)連続した行(2行目から4行目)が、前のマッチしない行(1行目)の後に追加され、1イベントとしてアウトプットされます。

もう1つ例として、下記のようにタイムスタンプをキーとしたまとまりを1イベントとして扱いたい場合を考えてみましょう。

[2015-08-24 11:49:14,389][INFO ][env                      ] [Letha] using [1] data paths, mounts [[/
(/dev/disk1)]], net usable_space [34.5gb], net total_space [118.9gb], types [hfs]
(/dev/disk1)]], net usable_space [34.5gb], net total_space [118.9gb], types [hfs]
[2015-08-24 11:49:15,567][INFO ][env                      ] [Letha] using [1] data paths, mounts [[/
(/dev/disk1)]], net usable_space [34.5gb], net total_space [118.9gb], types [hfs]
(/dev/disk1)]], net usable_space [34.5gb], net total_space [118.9gb], types [hfs]

この場合はNo3の設定を適用することができます。

multiline:
  pattern: '^\[[0-9]{4}-[0-9]{2}-[0-9]{2}'
  negate: true
  match: after

これはpatternにマッチしない連続した行(2行目から3行目)が、前のマッチする行(1行目)の後に追加され、1イベントとしてアウトプットされます。

16
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
12