あんまり知られてない機能について


Fluentdであんまり有名じゃないけど，使うとちょっと便利な機能の紹介．`()`で囲われているのは，それが利用可能になったバージョンです．


## idパラメータ (v0.10.33)

プラグインには設定で`@id`(`id`も可)が指定出来ます．`@id`が指定されていない場合には，Rubyの`object_id`が使われます．`in_monitor_agent`はこの値を`plugin_id`フィールドに入れるので，設定しておくと再起動しても値が変わらず便利です．

```aconf
<source>
  @type monitor_agent
</source>
```

上のだと，状態を取得した結果は以下になります．`plugin_id`に注目してください．

```js
{
   "plugins" : [
      {
         "plugin_category" : "input",
         "output_plugin" : false,
         "config" : {
            "@type" : "monitor_agent"
         },
         "type" : "monitor_agent",
         "retry_count" : null,
         "plugin_id" : "object:3fee7a0e4cc0"
      }
   ]
}
```

これを以下のように変更します．

```aconf
<source>
  @type monitor_agent
  @id monitor_agent_input
</source>
``````

そうすると，以下のように`monitor_agent_input`が`plugin_id`にセットされるようになります．

```js
{
   "plugins" : [
      {
         "plugin_category" : "input",
         "output_plugin" : false,
         "config" : {
            "@id" : "monitor_agent_input",
            "@type" : "monitor_agent"
         },
         "type" : "monitor_agent",
         "retry_count" : null,
         "plugin_id" : "monitor_agent_input"
      }
   ]
}
```

### @プレフィックスパラメータ

v0.12/v0.10.59からv1フォーマットにおいてですが，システムの設定はプラグインそのものの設定とのコンフリクトをさけるために，@をつけることになりました．今の所，以下の3つが該当します．

- @type: 今までのtypeと同じ
- @id: 今までのidと同じ
- @label: ラベルを指定する

このうち，`@type`と`@id`は`type`と`id`も後方互換性のために使えるようになってます．

## Rubyコードの埋め込み (v0.10.46)

v1フォーマット，つまり`--use-v1-config`を与えた時に使える機能ですが，`"#{}"`でRubyコードが埋め込めます．

```aconf
<filter **>
  @type record_transformer
  <record>
    key "#{ENV['KEY']}"
    hostname "#{Socket.gethostname}"
  </record>
</filter>
```

上記のように，環境変数を埋め込んだり，簡単なRubyのコードであれば呼び出すことが出来ます．

## config_section (v0.10.46)

プラグイン開発者向けの機能です．

out_forwardの`<server>`のような複数存在可能なセクションを自動で設定出来るようにしてくれる機能です．今までは`config_param`しかなくて書ける設定の幅が小さかったのですが，`config_section`などでだいたいのケースはカバー出来ます．

Fluentdのテストの[test_configurable.rb](https://github.com/fluent/fluentd/blob/8b4b94022167e0f80f71b2c2be4528cc80c5155a/test/config/test_configurable.rb#L36)にあるように，以下のように書けます．

```rb
class Base3 < Base2
  config_section :node do
    config_param :name, :string, :default => "node"
    config_param :type, :string
  end
  config_section :branch, required: true, multi: true do
    config_argument :name, :string
    config_param :size, :integer, default: 10
    config_section :leaf, required: false, multi: true do
      config_param :weight, :integer
      config_section :worm, param_name: 'worms', multi: true do
        config_param :type, :string, default: 'ladybird'
      end
    end
  end

  # other methods
end
```

必須かどうかの`required`や，複数存在する可能性があるかどうかを指定する`multi`など，いくつか設定があります．この辺，ドキュメントすべきなんですが間に合ってません…v0.12向けに色々と追加しまくっている所なので，一緒にやる予定です．

## --without-sourceオプション (v0.10.52)

Inputプラグインを起動させなくする機能です．ローカルに貯まっているバッファの再転送だけしたいという時に，Inputプラグインが立ち上がってしまうとまたイベントが来る可能性があるので，それらを防ぐことが出来ます．

## out_fileのappendパラメータ (v0.10.49)

`out_file`はデフォルトでファイルに追記せずに連番でチャンクを別々のファイルに書き出します．

```
log.20141219_0.log
log.20141219_1.log
...
log.20141220_1.log
```

これは並列に処理出来たりと便利なんですが，場合によっては時間内のファイルは一つにまとめて欲しい，という要望もあったりします．`append`を使うと，以下のように連番にせずに一つのファイルにマージします．

```
log.20141219.log
log.20141220.log
...
```

## TCP heartbeat (v0.10.31)

Fluentdの`in_forward` / `out_forward`は死活監視にデフォルトUDPを使いますが，TCPも使えます．`out_forward`側で`heartbeat_type tcp`を指定するだけです．環境によってはUDPがうまく行かない時もあるので，問題があるときは試してみてください．

v0.14からは，TCP heartbeatがデフォルトになる予定です: [Change default in_forward heartbeat type to TCP #450](https://github.com/fluent/fluentd/issues/450)

## その他

他にも思い出したのものがあれば追記するかもしれません．リポジトリのChangeLogや，各年のUpdate記事をみれば，他にも追加されている機能に関しては眺めることが出来ます．また，Advent Calendarにも色々と記事が投稿されているので，見返してみるのも良いでしょう．

- https://github.com/fluent/fluentd/blob/master/ChangeLog
- [Fluentd Update 2014](http://qiita.com/repeatedly/items/e4535709fe7d803d4b59)
- [Fluentd Update 2013](http://qiita.com/repeatedly/items/8960aa3aa0379d79c230)
- [Fluentd Advent Calendar 2013](http://qiita.com/advent-calendar/2013/fluentd)

今回ログ周りは意図的に省いてます．以下を参照してください．

- [Fluentdのロギング](http://qiita.com/repeatedly/items/691d2c33bfa06a0be781)

それでは良いロギングライフを〜