2014年10月7日火曜日

fluentdを使ってWindows環境のログを収集(パース編)

データアナリティクス事業部で、主にリアルタイム分析系のテクニカルエバンジェリストしている新村です。

前回に引き続き、ログ収集ツールのfluentdを使って、Windows環境のログ収集を行う方法についてご紹介していきたいと思います。
本記事は以下の記事を読んでいることを前提としています。


今回は、以下の図の通り、将来的な拡張を考慮しつつ、複数のプラグインを使ってログのパースからElasticsearchへの送信までを設定していきます。なお、点線で囲ってあるプラグインは、今回は設定しませんのでご注意ください。


■ 事前設定: nxlogの全角文字化け対策設定

Windows 2003 Server (Windows XP)以前の環境からログ収集を実行する場合や、コマンドプロンプトから出力されるログファイルは基本的に”Shift JIS”で出力されますが、ログ集約をするfluentdがインストールされているLinuxサーバーは基本的に”UTF-8”で運用されています。このため、単純にWindowsからログを収集してLinuxサーバーに転送すると文字化けが発生します(特に全角文字)。これを解消させるために、文字コードの変換処理をnxlogの設定ファイル(C:\Program Files (x86)\nxlog\conf\nxlog.conf)に書き加えます(赤字の部分)。

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 xm_syslog
</Extension>

<Extension charconv>
  Module xm_charconv
  AutodetectCharsets shift_jis, utf-8
</Extension>

<Input FileIn>
  Module im_file
  File "C:\\Applog\\sample_*.log" # 収集するログファイル(ワイルドカードも設定可能)
  SavePos TRUE
  InputType LineBased
  Exec convert_fields("shift_jis", "utf-8");
</Input>

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

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

<Route r>
  Path FileIn => Transform => SyslogOut
</Route>

なお、nxlogにはCSVファイルのパース機能や型指定、フィルタリング機能があります。ただし、ログのフォーマット修正が入った場合、同じ設定ファイルを導入しているすべてのnxlogの設定ファイルを修正する必要があるので、上記設定ファイルでは、ログに加工を施さず、そのままfluentdサーバーに送信するように記載してあります。

上記修正が完了したら、Start > 管理ツール > サービスから、サービス名”nxlog”を再起動して、設定ファイルを読み込ませます。以上でnxlog側の設定は完了です。

■ fluentd - 受信したログの確認

ここから本題に入っていきます。まずは、nxlogで収集したログのフォーマットを確認します。

Windows側でログを生成して、fluentdのログファイル(/var/log/td-agent/td-agent.log)にWindows側で生成されたログが表示されれば正常です。

[root@apacotta ~]# service td-agent restart
Shutting down td-agent:                                    [  OK  ]
Starting td-agent:                                         [  OK  ]
[root@apacotta ~]# tail -n1 /var/log/td-agent/td-agent.log
WindowsLog.user.notice: {"host":"WIN-F4LLDGSEU5S","ident":"","message":"2014/10/02 20:58:03.30,C:\Applog\sample.bat,33,ログイン処 理,Administrator,177.131.237.237"}

■ fluentd - 受信したログのパース

受信したログを正規表現でパース(構文解析)していきます。パース用のプラグイン”tagomoris/fluent-plugin-parser”をインストールして、パースの設定を行います。



正規表現の簡単なルールやテストはRubularで行うことができます。正規表現が完成したら、fluentdの設定ファイル(/etc/td-agent/td-agent.conf)の設定ファイルを以下の通りに修正します(赤字の部分)。

<source>
  type syslog
  port 5140
  tag RAW.WindowsLog
</source>

<match RAW.WindowsLog.**>
  type parser
  remove_prefix RAW
  add_prefix PARSED
  format /^(?<time>\d{4}\/\d{2}\/\d{2}\s\d{2}:\d{2}:\d{2}.\d{2}),(?<dir>[^,]*),(?<ptime>\d*),(?<event>[^,]*),(?<user>[^,]*),(?<ip>[^,]*)$/
  reserve_data yes
  key_name message
</match>

<match PARSED.WindowsLog.**>
  type stdout
</match>

修正が完了したら、”fluent-plugin-parser”をインストールしてからtd-agentを再起動します。Windows側で生成されたログが”fluentd - 受信したログの確認”と異なり分割されます。

[root@apacotta ~]# /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-parser
Successfully installed fluent-plugin-parser-0.3.4
1 gem installed
Installing ri documentation for fluent-plugin-parser-0.3.4...
Installing RDoc documentation for fluent-plugin-parser-0.3.4...
[root@apacotta ~]# service td-agent restart
Shutting down td-agent:                                    [  OK  ]
Starting td-agent:                                         [  OK  ]
[root@apacotta ~]# tail -n1 /var/log/td-agent/td-agent.log
2014-10-02 21:23:56 +0900 PARSED.WindowsLog.user.notice: {"host":"WIN-F4LLDGSEU5S","ident":"","message":"2014/10/02 21:23:56.08,C:\Applog\sample.bat,67,ログアウト処理,Administrator,255.19.170.200","dir":"C:\Applog\sample.bat","ptime":"67","event":"ログアウト処理","user":"Administrator","ip":"255.19.170.200"}

■ fluentd - ログの型設定

パースしたログは、すべて文字型として処理されます。このままElasticSearchに投入すると、数値の平均値や最大値を表示することができなくなるため、”tarom/fluent-plugin-typecast”を使って、文字型の値を数値型に変換します。

fluentdの設定ファイル(/etc/td-agent/td-agent.conf)の設定ファイルを以下の通りに修正します(赤字の部分)。

<source>
  type syslog
  port 5140
  tag RAW.WindowsLog
</source>

<match RAW.WindowsLog.**>
  type parser
  remove_prefix RAW
  add_prefix PARSED
  format /^(?<time>\d{4}\/\d{2}\/\d{2}\s\d{2}:\d{2}:\d{2}.\d{2}),(?<dir>[^,]*),(?<ptime>\d*),(?<event>[^,]*),(?<user>[^,]*),(?<ip>[^,]*)$/
  reserve_data yes
  key_name message
</match>

<match PARSED.WindowsLog.**>
  type typecast
  item_types host:string,ident:string,message:string,dir:string,ptime:integer,event:string,user:string,ip:string
  tag WindowsLog
</match>

<match WindowsLog.**>
  type stdout
</match>

修正が完了したら、”fluent-plugin-typecast”をインストールしてからtd-agentを再起動します。”ptime”は数値型を指定したので、出力されたValueがダブルクオートで囲まれていません。

[root@apacotta ~]# /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-typecast
Fetching: fluent-plugin-typecast-0.1.2.gem (100%)
Successfully installed fluent-plugin-typecast-0.1.2
1 gem installed
Installing ri documentation for fluent-plugin-typecast-0.1.2...
Installing RDoc documentation for fluent-plugin-typecast-0.1.2…
[root@apacotta ~]# service td-agent restart
Shutting down td-agent:                                    [  OK  ]
Starting td-agent:                                         [  OK  ]
[root@apacotta ~]# tail -n1 /var/log/td-agent/td-agent.log
2014-10-02 21:34:46 +0900 WindowsLog: {"host":"WIN-F4LLDGSEU5S","ident":"","message":"2014/10/02 21:34:46.28,C:\Applog\sample.bat,38,更新処理,Administrator,225.87.31.166","dir":"C:\Applog\sample.bat","ptime":38,"event":"更新処理","user":"Administrator","ip":"225.87.31.166"}

■ fluentd - ElasticSearchへのデータ投入

最後にElasticSearchへのデータ投入を行います。ElasticSearchは、米ElasticSearch社の提供するオープンソースの全文検索エンジンです。

長い間頑張ってくれた、stdoutを削除してelasticsearchプラグインの設定を行います。
fluentdの設定ファイル(/etc/td-agent/td-agent.conf)の設定ファイルを以下の通りに修正します(赤字の部分)。

<source>
  type syslog
  port 5140
  tag RAW.WindowsLog
</source>

<match RAW.WindowsLog.**>
  type parser
  remove_prefix RAW
  add_prefix PARSED
  format /^(?<time>\d{4}\/\d{2}\/\d{2}\s\d{2}:\d{2}:\d{2}.\d{2}),(?<dir>[^,]*),(?<ptime>\d*),(?<event>[^,]*),(?<user>[^,]*),(?<ip>[^,]*)$/
  reserve_data yes
  key_name message
</match>

<match PARSED.WindowsLog.**>
  type typecast
  item_types host:string,ident:string,message:string,dir:string,ptime:integer,event:string,user:string,ip:string
  tag WindowsLog
</match>

<match WindowsLog.**>
  type elasticsearch
  host 54.200.236.2    # ElasticSearchをセットアップしたサーバのIPアドレス
  port 9200
  type_name WindowsLog
  logstash_format true
  logstash_prefix nginx_access
  logstash_dateformat %Y%m

  # Buffering
  buffer_type memory
  buffer_chunk_limit 200m
  buffer_queue_limit 1024
  flush_interval 1s
  retry_limit 16
  retry_wait 1s
</match>

修正が完了したら、”fluent-plugin-elasticsearch”をインストールしてからtd-agentを再起動します。

[root@apacotta ~]# /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-elasticsearch
Successfully installed fluent-plugin-elasticsearch-0.4.0
1 gem installed
Installing ri documentation for fluent-plugin-elasticsearch-0.4.0...
Installing RDoc documentation for fluent-plugin-elasticsearch-0.4.0...
[root@apacotta ~]# service td-agent restart
Shutting down td-agent:                                    [  OK  ]
Starting td-agent:                                         [  OK  ]

■ データの確認

ログが正しくelasticsearchに転送されていることを、同じくElasticsearch社が提供するダッシュボードツールのkibanaから確認します。ElasticSearchとKibanaのセットアップ方法については、ウェブ上に日本語英語問わず色々記事があるので、そちらを参照してください。

kibanaにアクセスして、トップ画面の下部にある”Sample Dashboard”をクリックします。


遷移した先の画面で、WindowsLogが表示されていれば設定は成功しています。




0 件のコメント:

コメントを投稿