# Filebeatの再起動を伴わずにinput定義を追加したい

**URL:** <https://discuss.elastic.co/t/filebeat-input/209611>\
**Category:** 日本語による質問・議論はこちら\
**Created:** [November 27, 2019, 5:46am UTC](https://discuss.elastic.co/t/filebeat-input/209611 "2019-11-27T05:46:45Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![t-nakata](https://avatars.discourse-cdn.com/v4/letter/t/8491ac/32.png) [@t-nakata](https://discuss.elastic.co/u/t-nakata)\
**Post date:** [November 27, 2019, 5:46am UTC](https://discuss.elastic.co/t/filebeat-input/209611/1 "2019-11-27T05:46:45Z")

</div>

filebeatで再起動を伴わずにinput定義を追加する方法があるかどうかご教示ください。

＜やりたいこと＞  
ログAをinputとして起動して、運用中に新しくログBを追加する際、サービス停止(filebeatの再起動)を伴わずに定義を追加したい。

下記のymlの設定でいうと、もともとログAの定義のみ設定されている状態で、filebeat再起動無しでログBの設定を追加したいです。

```
filebeat.inputs:

- type: log
  enabled: true
  paths:
    - /var/tmp/metatest.log ※ログA
    - /var/tmp/filebeat/*.log ※ログB

```

filebeat.ymlは動的にリロード出来ない認識なのですが、実現する方法はありますでしょうか？  
(モジュールを別に作成するような方法でしょうか)

---

<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:** [November 27, 2019, 8:53am UTC](https://discuss.elastic.co/t/filebeat-input/209611/2 "2019-11-27T08:53:09Z")

</div>

ご認識の通り filebeat.yml自体のリロードはありませんが、input.configであれば設定ファイルを別に切り出すことで、実現可能かと思います。

[https://www.elastic.co/guide/en/beats/filebeat/current/\_live\_reloading.html](https://www.elastic.co/guide/en/beats/filebeat/current/_live_reloading.html)

上のサイトにあるように、filebeat.ymlを設定します。filebeat.ymlの中では type: logの設定は書きません。

pathには、リロードさせたい設定ファイルを書きます。ここではconfigフォルダの下にある\*.ymlとしました。

```auto
#=========================== Filebeat inputs =============================

filebeat.config.inputs:
  enabled: true
  path: config/*.yml
  reload.enabled: true
  reload.period: 10s

```

次に config/log.ymlを作成します。さきほどpathで指定した対象となる設定ファイルです。

```auto
- type: log
  enabled: true
  paths:
    - C:\elastic\logs\1\*

```

（参考）  
[https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-configuration-reloading.html](https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-configuration-reloading.html)

このようにして、filebeatを実行すると、config/log.ymlの中身も評価されて実行されます。

そして、filebeat起動中に以下のように新しいInput先を追加して保存しても、リロードされて追加した先のファイルも取得対象になります。

```auto
- type: log
  enabled: true
  paths:
    - C:\elastic\logs\1\*
    - C:\elastic\logs\2_added\*

```

手元で動かしてみたところ、おっしゃるような内容は満たされるように思いました。  
ご参考になれば幸いです。

---

<div class="post-metadata">

**Author:** ![t-nakata](https://avatars.discourse-cdn.com/v4/letter/t/8491ac/32.png) [@t-nakata](https://discuss.elastic.co/u/t-nakata)\
**Post date:** [November 28, 2019, 2:33am UTC](https://discuss.elastic.co/t/filebeat-input/209611/3 "2019-11-28T02:33:35Z")

</div>

ご回答ありがとうございます。ご教示頂いた方法で試したところ、想定通り実現できました。ありがとうございます。

追加で質問なのですが、マニュアルを見たところ、外部ファイルとして切り出せるのはinputの定義のみであるように思えます。

例えば、上記の例で、ログAはインデックスAに登録しており、後から追加したログBはインデックスBに登録したいという場合、外部ファイルでインデックス名の定義は可能でしょうか？  
インデックス名の定義は、filebeat.ymlの「 Elasticsearch output」で行うため、外部への切り出しが出来ないのではと思っております。

---

<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:** [November 28, 2019, 2:53am UTC](https://discuss.elastic.co/t/filebeat-input/209611/4 "2019-11-28T02:53:58Z")

</div>

おっしゃるように、ドキュメントでは filebeat.config.inputsかmodulesでreloadは有効とあり、outputは対象になっていないように見えます。

> To enable dynamic config reloading, you specify the `path` and `reload` options under `filebeat.config.inputs` or `filebeat.config.modules` sections.

軽量なデータシッパーであることがウリなbeatsシリーズなので、再起動するのがもっとも確実かつ簡単だと思っておりますが、  
**どうしても** 外部から入れるIndex先を変更・指定したいということでしたら、  
PipelineのIngest Processorを併用するのはどうでしょうか。

> **[Ingest processor context | Painless Scripting Language \[8.11\] | Elastic](https://www.elastic.co/guide/en/elasticsearch/painless/current/painless-ingest-processor-context.html)**

> **Side Effects**  
> [`ctx['_index']` ]([https://www.elastic.co/guide/en/elasticsearch/reference/7.4/mapping-index-](https://www.elastic.co/guide/en/elasticsearch/reference/7.4/mapping-index-)  
> field.html)  
> Modify this to change the destination index for the current document.

このように記載されているので、ctx['\_index']を変更することで、Index名を動的に変更させることができるかと思います。  
以下はサンプルですが、何かの条件に合致したらindex名をnew-indexにするPipelineの定義です。

```auto
PUT _ingest/pipeline/forum1128
{
    "processors": [
      {
        "script": {
          "source": """
            if (何かの条件) {
              ctx['_index'] = "new-index"
            }
          """
        }
      }
    ]
}

```

ご参考になれば幸いです。

---

<div class="post-metadata">

**Author:** ![t-nakata](https://avatars.discourse-cdn.com/v4/letter/t/8491ac/32.png) [@t-nakata](https://discuss.elastic.co/u/t-nakata)\
**Post date:** [November 28, 2019, 8:24am UTC](https://discuss.elastic.co/t/filebeat-input/209611/5 "2019-11-28T08:24:38Z")

</div>

ありがとうございます。参考にさせて頂きます。

ご教示頂いたPipelineのIngest Processorを使用する際、「何かの条件」をタグ名にすることを検討しています。

外部ファイルを以下のようにし、タグが「1」だったらインデックス名を変更するようにしたいです

```
- type: log
  enabled: true
  paths:
    - /var/tmp/access.log
    - /var/tmp/error.log
  tags:
    - "1"

```

その際、Pipelineを以下のように定義したのですが、想定どおりとなりませんでした。

```
PUT _ingest/pipeline/forum1128
{
    "processors": [
      {
        "script": {
          "source": """
            if (ctx['tags'] == "1") {
              ctx['_index'] = "aaa-index"
            }
          """
        }
      }
    ]
}

```

おそらく、タグ名がうまく取得できていないと想定しており、いくつか書き方を試してみましたがいずれもうまくいきません。どのように定義すれば良いか、ご教示頂けないでしょうか

---

<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:** [November 28, 2019, 12:57pm UTC](https://discuss.elastic.co/t/filebeat-input/209611/6 "2019-11-28T12:57:51Z")

</div>

ちょうどtagsを使った例が公式サイトにもありますね。（not\_prod\_dropperのところです）  
[https://www.elastic.co/guide/en/elasticsearch/reference/master/ingest-conditional-complex.html](https://www.elastic.co/guide/en/elasticsearch/reference/master/ingest-conditional-complex.html)

HOGEの部分を１と読み替えていただければ以下で動作が確認できるかと思います。

## Ingest Pipelineの作成

```auto
PUT _ingest/pipeline/forum1128
{
    "processors": [
      {
        "script": {
          "source": """
            Collection tags = ctx.tags;
            if (tags != null && tags.contains("HOGE")){
                    ctx['_index'] = "new-index123"  
            }
          """
        }
      }
    ]
}

```

## テスト

Pipelineにはシミュレート機能があるので、これでテストします。  
tags自体が存在しないときや、条件に合致しないときも期待した動作となることを確認します。

```auto
POST _ingest/pipeline/forum1128/_simulate
{
  "docs": [
    {
      "_index": "filebeat",
      "_id": "id1",
      "_source": {
        "tags": [
          "HOGE",
          "BAR",
          "PIYO"
        ],
        "message": "aiueo"
      }
    },
    {
      "_index": "filebeat",
      "_id": "id2",
      "_source": {
        "tags": [
          "BAR",
          "PIYO"
        ],
        "message": "aiueo"
      }
    },
    {
      "_index": "filebeat",
      "_id": "id3",
      "_source": {
        "message": "aiueo"
      }
    },
    {
      "_index": "filebeat",
      "_id": "id4",
      "_source": {
        "tags": [
          "HOGE123",
          "BAR",
          "PIYO"
        ],
        "message": "aiueo"
      }
    },
    {
      "_index": "filebeat",
      "_id": "id5",
      "_source": {
        "tags": [],
        "message": "aiueo"
      }
    }
  ]
}

```

- id1 -\> HOGEが含まれるため、new-indexになる
- id2 -\> HOGEがないため、そのまま
- id3 -\> tagsフィールド自体が存在しないため、そのまま
- id4 -\> HOGE123はあるがHOGEではないため、そのまま
- id5 -\> tagsフィールドはあるが空要素のため、そのまま

以上です

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [December 26, 2019, 12:57pm UTC](https://discuss.elastic.co/t/filebeat-input/209611/7 "2019-12-26T12:57:55Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
