2014年9月10日水曜日

fluentdを使ってWindows環境のログを収集

データアナリティクス事業部でリアルタイム分析を担当している新村です。

オープンソースのログ収集ソフトの"fluentd"は、長いこと「Windowsでは動作しません」と公式サイトのドキュメントに明示していましたが、2014年7月29日付でWindowsからのログ収集方法がドキュメントに追記されていました。
http://docs.fluentd.org/ja/articles/windows



いろいろな事情が重なったこともあって、fluentdを使ってWindows環境からログを収集する機会に恵まれたので、前回のブログのテーマからはガラッと変わって、今回は、fluentdを使ったWindows環境のログ収集方法に関する備忘録を書いていきたいと思います。

なお、公式サイトのドキュメントでは、Windows8 64bitでセットアップ・テストをしているとの記載がありますが、私はWindows Server 2008 R2 (Amazon EC2の2008 R2)を使ってセットアップをしてみました。

■ 今回構築する環境

今回は、公式サイトのドキュメント通りの設定をおこないます。システム構成のイメージは以下の通りです。

■ Linux側の準備

  1. td-agentのインストール
    まずは、Linuxのサーバーにfluentdのエージェントプログラムであるtd-agentをインストールします。インストール手順は基本的に公式サイトのドキュメントに従っています。
    Redhat系でインターネットに接続されている場合は、管理者権限で以下の通りに、コマンドラインを一行叩けばインストールは完了です。インストールが終わったら、サービスが自動起動するようにchkconfigを仕掛けてインストールは完了です。

    [root@apacotta ~]# curl -L http://toolbelt.treasuredata.com/sh/install-redhat.sh | sh
    [root@apacotta ~]# /etc/init.d/td-agent start
    Starting td-agent:                                         [  OK  ]
    [root@apacotta ~]# chkconfig td-agent on
    [root@apacotta ~]# chkconfig --list td-agent
    td-agent        0:off   1:off   2:on    3:on    4:on    5:on    6:off

  2. ポート解放
    windowsで収集したログは、udpの5140ポートを使って転送されます。このため、Linux側の受信ポートを解放しておきます。

    [root@apacotta ~]# vi /etc/sysconfig/iptables
    ---
    ...
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
    -A INPUT -p udp --dport 5140 -j ACCEPT
    -A INPUT -j REJECT --reject-with icmp-host-prohibited
    ...
    ---
    [root@apacotta ~]# service iptables restart
    iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
    iptables: Flushing firewall rules:                         [  OK  ]
    iptables: Unloading modules:                               [  OK  ]
    iptables: Applying firewall rules:                         [  OK  ]

  3. td-agentのセットアップ
    td-agentが、syslogを受信できるように設定ファイルを変更します。まずは、疎通確認の意味でfluentdのログファイルにWindowsのログを出力させます。設定ファイルの出力先タイプにstdoutを指定します。設定が完了したらサービスを再起動して、設定を読み込ませます。

    [root@apacotta ~]# vi /etc/td-agent/td-agent.conf
    --
    ...
    # Windows Log Collection
    <source>
      type syslog
      port 5140
      tag windowslog
    </source>
    <match windowslog.**>
      type stdout
    </match>
    --
    [root@apacotta ~]# service td-agent restart
    Shutting down td-agent:                                    [  OK  ]
    Starting td-agent:                                         [  OK  ]

    以上でLinux側の設定は完了です。

■ Windows側の準備

  1. nxlogのインストール
    nxlogはマルチプラットフォームで使える、オープンソースのログの収集と転送ツールで、転送時のフォーマットもSyslog, Windows EventLog, Graylog2 GELF, XML, JSON, CSVと色々選択することができます。
    nxlogの公式サイトから、コミュニティ版のWindowsインストーラーをダウンロードしてきます。



    ダウンロードが完了したら、インストーラーを実行します。
    インストーラーは、オプションも無く(インストール場所の指定すらウィザードに現れないシンプルさ!)、一瞬で終わります。


  1. nxlogのセットアップ
    nxlogは設定ファイルを書いて読み込ませれば動きます。
    C:\Program Files (x86)\nxlog\conf\nexlog.conf をテキストエディタで開いて以下の通りに編集します。アンダーラインの付いている部分については、設定する環境にあわせて設定してください("Processor t"や"Route r"は、ミスタイプでは無くエイリアスです)。

    define ROOT C:\Program Files (x86)\nxlog

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

    <Extension syslog>
    Module
    </Extension>

    <Extension json>
    Module
    </Extension>

    <Input in>
    Module im_file
    File "C:\Applog\exec.log" # 収集するログファイル(ワイルドカードも設定可能)
    SavePos TRUE
    InputType LineBased
    </Input>

    <Processor t>
    Module pm_transformer
    OutputFormat syslog_bsd
    Exec $Message=(": "+$raw_event);
    </Processor>

    <Output out>
    Module om_udp
    Host 54.200.236.1 # Linuxの準備で設定したサーバのIPアドレス
    Port 5140
    </Output>

    <Route r>
    Path in => t => out
     </Route>

■ 稼働確認

  1. nxlogの起動
    コマンドラインからnxlogを実行します。

    C:\Users\Administrator>cd "C:\Program Files (x86)\nxlog"
    C:\Program Files (x86)\nxlog>nxlog.exe -f -c ./conf/nxlog.conf
    2014-09-09 00:55:21 INFO nxlog-ce-2.8.1248 started

  2. ログの出力
    nxlogの対象となっているログファイルにログを出力させます。バッチファイルを使ってテスト的に以下のフォーマットのログを出力しました。

    2014/09/08, 9:49:04.18,C:\Applog\sample.bat,30,Administrator

  3. ログ転送の確認
    Windowsサーバーでログを出力させたら、Linuxサーバのtd-agentログに転送されたテキストが表示されます。

    [root@apacotta ~]# tail -n1 /var/log/td-agent/td-agent.log
    --
    2014-09-08 9:49:08 +0000 windowslog.user.notice: {"host":"WIN-F4LLDGSEU5S","ident":"","message":"2014/09/08, 9:49:04.18,C:\\Applog\\sample.bat,30,Administrator"}
    --

    Jsonでログが表示されていれば完了です。表示されていない場合は、Windows側は"C:\Program Files (x86)\nxlog\data\nxlog.log"に、Linux側は"/var/log/td-agent/td-agent.log"にエラーが表示されるので確認をしてください。

■ 次のステップ

収集したログはパースされていないのでパースする必要があります。また、今回は、stdoutに出力しましたが、用途に合わせてログの出力先を変更する必要もあります。
次回は、収集したログをパースしてkibanaで可視化する部分について書いていきます。

0 件のコメント:

コメントを投稿