fluentd Windows版をWindowsサービスとして動かす

## 0. 前書き
本稿ではfluentd WindowsブランチをWindowsサービスとして動かすことにチャレンジします。
![fluentdwinsvc3.JPG](https://qiita-image-store.s3.amazonaws.com/0/31816/8ad3f5e7-d080-b35e-e2d0-2384ee6eda76.jpeg)

通常の（Linux向けの）デーモンオプションを使ってもWindowsサービスとしては動きません。というかエラーになります。
Windowsサービスように実装された機能を使って登録する必要があります。
本投稿ではこれにチャレンジします。

なお、利用しているRubyのバージョンは 2.1(x64)となります。


## 1. fluentd Windows版の導入
以下の記事にしたがってfluentd Windowdsブランチを導入します。

["fluentd WindowsブランチをRuby 2.1上で動かす"](http://qiita.com/okahashi117/items/a0b55ea24a6ef7b6582b)

ただし、「2. fluentd gemパッケージ」では以下のパッケージ（最新版）を導入します。
これ以前のパッケージではWindowsサービスとして正しく動作しません。

```
> gem install pkg/fluentd-0.10.46.win150316001.gem --no-ri --no-rdoc
```


## 2. Windowsサービスとしての登録
![gear-wheel-310906_640.png](https://qiita-image-store.s3.amazonaws.com/0/31816/ee1b5c91-f410-4461-059b-57788e4eb501.png)

Windowsサービスとして登録します。
**管理者権限で**コマンドプロンプトと立ち上げます。かならず管理者権限で立ち上げてください。Windowsサービスの登録には管理者権限が必須です。

管理者権限で立ち上げたコマンドプロンプトから、以下のコマンドを実行します。

```
> fluentd --reg-winsvc i
```

実行しましたか？このコマンドは成功すると何も表示しませんｗ
ではサービス一覧画面から確認しましょう。

コントロールパネル > システムとセキュリティ > 管理ツール > サービス

を立ち上げて確認すると ...

![fluentdwinsvc.JPG](https://qiita-image-store.s3.amazonaws.com/0/31816/0fa22bb3-c099-21ea-def6-fbf72dd14784.jpeg)

![fluentdwinsvc2.JPG](https://qiita-image-store.s3.amazonaws.com/0/31816/ba274ea7-5325-69ed-57a4-5a1dd142754b.jpeg)

いますね！
Windowsサービス名は 
> fluentdwinsvc 

表示名は
> Fluentd Windows Service

となっています。

ダブルクリックしてプロパティ画面を開くとこんな感じ。
![fluentdwinsvc3.JPG](https://qiita-image-store.s3.amazonaws.com/0/31816/8ad3f5e7-d080-b35e-e2d0-2384ee6eda76.jpeg)


## 3. fluentdのオプションを指定する
上記のステップ2で、Windowsサービスとしての登録はできましたが、この段階ではfluentdのオプションが一切登録されていません。
ここでは以下のオプションを登録します。

* C:/fluent/fluent.conf を使う
* C:/fluent/fluent.log にログを書く

これ自体もfluentdのコマンドオプションとして登録します。以下のようにコマンドプロンプトからコマンドを実行します（引き続き管理者権限必須）。

```
> fluentd --reg-winsvc-fluentdopt '-c C:/fluent/fluent.conf -o C:/fluent/fluent.log'
```


## 4. 設定ファイル
あとは設定ファイルです。上記で指定した C:/fluent/fluent.confにお好みで設定ファイルを書きましょう。とりあえず in_forward で受け付けて、 out_file するだけの設定にしておきます。

```fluent.conf
<source>
  type forward
</source>

<match **>
  type file
  path C:/fluent/test
  time_slice_format %Y%m%dT%H%M%S
  time_slice_wait 5s
</match>
```

## 5. いざ！
動かしましょう！
「2. Windowsサービスとしての登録」で確認した Fluentd Windows Serviceのプロパティ画面を開いて開始ボタンをポチッとな！
![fluentdwinsvc-start.jpg](https://qiita-image-store.s3.amazonaws.com/0/31816/352fc76a-ea7b-d31c-edbd-f09f4de67322.jpeg)

ちょっと待つと...ハイキタ！
![fluentdwinsvc-running.jpg](https://qiita-image-store.s3.amazonaws.com/0/31816/a09d1507-10a3-dd83-b852-f3cd6e1a6567.jpeg)

-oオプションで指定したログファイルをみてみましょう...イイデスネ！
![fluentdwinsvc-log3.JPG](https://qiita-image-store.s3.amazonaws.com/0/31816/93377460-9a33-f307-d1e0-2355e24989a1.jpeg)

in_forwardに放り込んでみましょう。
コマンドプロンプト（管理者権限不要）から...

```
> echo {"strng":"Hello Fluentd Windows Service"} | fluent-cat test
```

Windows サービス動作なので見た目上何もおきていません。
out_fileで指定した C:/fluent/test.%日付%.log をみてみましょう...イイデスネ！
![fluentdwinsvc-outfile.jpg](https://qiita-image-store.s3.amazonaws.com/0/31816/df1c953d-1413-d6e1-4c1b-170025a2bfdf.jpeg)

概ね以上です。
まぁ実証だけなので特段面白くともなんともありませんがご勘弁を。

## 6. Windowsサービスの停止
これはいいですよね。普通のWindowsサービスと同等に扱えばよいです。割愛。

## 7. Windowsサービス登録の削除
fluentdコマンドでおこないます。
なおfluentd Windows Serivceが停止状態でおこなう必要があります。
再び **管理者権限でコマンドプロンプトを立ち上げて** 以下のコマンドを実行します。

```
> fluentd --reg-winsvc u
```

成功しても特にメッセージはでません。
コントロールパネル > システムとセキュリティ > 管理ツール > サービス 
でFluentd Windows Serviceが削除されていることを確認しましょう。

## 8. その他
もし何かの理由でうまく終了できずにプロセスが残ってしまう等の現象が起きた場合は、タスクマネージャかProcess Explorer（管理者権限起動）にて終了させましょう。

おわり。