意外に簡単でしたの かっぱ@inokara)です。

何したか?

fluentd のドキュメントにちゃんと載っていました…。

  1. nxlog をインストールして設定
  2. とりあえずは fluentd 側は type syslog で待ち受ける
  3. fluentd まで届けばあとは良しなに…

nxlog というツールで Windows のイベントログを in_tail っぽいことをして type syslog で待ち構えている fluentd にログを飛ばすという流れです。


nxlog とは

個人的に気になったは…

  • こちらを御覧ください
  • マルチプラっとフォーム
  • モジュールアーキテクチャ
  • クラサバモード
  • Apache の設定ファイルと同様のシンタックス

などなど


nxlog のインストールと設定

インストール

Windows Server 2012 を利用します。

2014081605.png

こちらから MSI ファイルをダウンロードしてダブルクリックすると以下のようにセットアップウィザードが起動します。

2014081604.png

ウィザードに従ってインストールを完了します。

設定

nxlog が正常にインストールされると C:Program Files (x86)nxlog 以下にバイナリファイルや関連する設定ファイルが保存されます。

2014081606.png

confnxlog.conf を以下のように設定します。

nxlog.conf
define ROOT C:Program Files (x86)nxlog

Moduledir %ROOT%modules
CacheDir %ROOT%data
Pidfile %ROOT%datanxlog.pid
SpoolDir %ROOT%data
LogFile %ROOT%datanxlog.log

<Extension syslog>
   Module      xm_syslog
 </Extension>
 <Extension json>
   Module      xm_json
 </Extension>
 <Input in>
   Module im_mseventlog
 </Input>
 <Processor t>
   Module pm_transformer
   OutputFormat syslog_bsd
   Exec $Message=(": "+$raw_event);
 </Processor>
 <Output out>
   Module om_udp
   Host ${fluentd_host}
   Port 5140
 </Output>
 <Route r>
   Path in => t => out
 </Route>

先述のように nxlog も fluentd のようにプラグイン(モジュール)機構が採用されており、今回は im_mseventlogInput in に設定します。また、Output out には ${fluentd_host} とポート番号を指定します。

ちなみに

Route r の定義あたりは面白いなあと思います。詳しくドキュメントを読み込めていませんが、ログのルーティングを矢印で表現してるようです。また、Processor t あたりはログを任意の形式に書き換えるような設定のようです。


fluentd 側の設定(td-agent 側の設定)

fluentd(td-agent)を動かすホストは Windows Server とは別の Linux マシンにあらかじめ td-agent をインストールしておきます。

/etc/td-agent/conf.d/winlogconf
<source>
   type syslog
   port 5140
   tag windowslog
 </source>
 <match windowslog.**>
   type stdout
 </match>

上記のように fluentd 側は type syslog で待ち受けます。


nxlog を起動してログを見てみる

Windows Server にてコマンドプロンプト又は PowerShell を起動して nxlog がインストールパスまで移動して以下のように実行します。

 .nxlog.exe -f -c '.confnxlog.conf'

実行すると以下のように表示されればとりあえず nxlog は起動しているはずです。

2014081607.png

この状態で Windows で適当に操作していると td-agent の /var/log/td-agent/td-agent.log に以下のようにログが出力されます。

2014081608.png

おお、イベントログが記録されています。しかも JSON 形式となっています。


設定例から nxlog をも少しみてみる

設定例から nxlog をも少しみてみます。

以下は output モジュールの HTTP(S) 用の設定例です。

path/to/nxlog.conf
<Input in>
    Module      im_file
    File        'input.log'
    ReadFromLast    FALSE
</Input>

<Output out>
    Module      om_http
    URL         https://server:8080/
    HTTPSCertFile   %CERTDIR%/client-cert.pem
    HTTPSCertKeyFile    %CERTDIR%/client-key.pem
    HTTPSCAFile     %CERTDIR%/ca.pem
    HTTPSAllowUntrusted FALSE
</Output>

<Route httpout>
    Path    in => out
</Route>

Input in には im_file を設定して対象となるファイルを File 'input.log' で指定しています。次に Output out に Output の om_http を指定しています。そして、Output に対するルーティングを Route httpout で定義しています。Path in => out は Input をそのまま Output にルーティングする定義のようです。


とりあえず…

本来は全てを fluentd でまかなえると嬉しい(次回は fluentd Windows 版を試してみたいと思います)のですが fluentd まで持ってくることが出来れば、後は S3 に保存するなり、可視化するなりの道は開けてきそうです。

元記事は、こちらです。
Windows のイベントログを fluentd で何とか出来ないか調べてみたら nxlog を組み合わせることで…