ビジネス課題への解決策(アイディア)と、新たな発想(+α)が見つかるIT情報メディア

Menu
  1. TOP
  2. システム運用
  3. fluentdを使ってWindows環境のログを収集(パース編)

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

  • LINEで送る
  • このエントリーをはてなブックマークに追加

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

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


                                                                              

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

Windows 2003 Server (Windows XP)以前の環境からログ収集を実行する場合や、コマンドプロンプトから出力されるログファイルは基本的に”Shift JIS”で出力されますが、ログ集約をするfluentdがインストールされているLinuxサーバーは基本的に”UTF-8”で運用されています。このため、単純にWindowsからログを収集してLinuxサーバーに転送すると文字化けが発生します(特に全角文字)。これを解消させるために、文字コードの変換処理をnxlogの設定ファイル(C:Program Files (x86)nxlogconfnxlog.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 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:Applogsample.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}sd{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:Applogsample.bat,67,ログアウト処理,Administrator,255.19.170.200","dir":"C:Applogsample.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}sd{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がダブルクオートで囲まれていません。

<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}sd{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>

■ 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}sd{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を再起動します。

<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}sd{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>

■ データの確認

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

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

 

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

データの抽出や加工、連携にお悩みではありませんか?

20年以上の実績に裏打ちされた信頼のデータ連携ツール「Waha! Transformer」で、自社に眠るデータを有効活用。まずは無料のハンズオンセミナーや体験版で効果を実感していただけます。

> 純国産ETLツール「Waha! Transformer」

Waha! Transformer
メールマガジンの登録はこちらから
メルマガ登録 お問い合わせ