NXLog

ヨーロッパのNXLog社が開発しているロギングプログラムで、
無料のNXLog Community Editionと、有料のNXLog Enterprise Editionが存在する。
Linux・Windows・macOSなど様々なプラットフォームで動作する上、
Windowsイベントログのフィルタリングとsyslog転送が出来る。

参考サイト

設定ポイント

A. データソース数
WindowsServer2016のイベントログソース数は256種を超えるが、
NXLog-CEではログソース256種を超える事が出来ない。
IISやADドメコン等のWindowsServerサービスを構築した際も簡単に256種を超えるので注意が必要となる。
ログソース数の制限を突破した状態でNXLogを起動すると、
NXLog本体のログに制限突破のwarningが出力されつつ256種目以上のログが取得出来なくなる。
問題を回避するには、OSの出力するイベントログを減らすか、NXLogで取得するログを種類毎に分割する。

NXLogで取得するログを種類毎に分割する方法は色々あるが、
アプリケーションソース毎にNXLogのログ取得セクションを設定しておき、
ログを出力するセクションでログを合体出力させるとコンフィグが複雑化しにくくなる。
Windowsイベントログのアプリケーションソース名は、次のPowerShellコマンドを実行して確認する。

PS > Get-EventLog -list | Select -Property Log

 
レベルはWindowsのイベントログ需要度レベルに合わせて重要度を数値で指定する。
または、MicrosoftのWindows Event Selectionに従ってクエリを作る。

Level=1 : Critical Error
Level=2 : Error
Level=3 : Warning
Level=4 : Information
Level=5 : Verbose

 
デフォルトではsyslog転送出来るWindowsイベントログの内容が少ない為、
ログをJSONに変換しつつsyslogのmessageコンテンツに代入して全項目を出力出来る様にする。
ホスト名は環境によって内容が変化してしまうので、ホスト名で上書きして情報を統一させる。

 サンプルコンフィグ



B. syslog転送
NXLogからsyslog転送する時に、BSD-Syslog/IETF-Syslog何れかのフォーマットで出力すると、
Facility:User(5)/Severity:Notice(5)で送信する。
このままだとログサーバでフィルタリングしにくいので、
ログ出力セクションでFacilityとSeverityを上書きして任意の値で転送する。
 
デフォルトではsyslogのプログラム名が、イベントログのアプリケーションソース名で可変となる。
このままだとログサーバでアプリケーション毎の出力振分けが出来なくなるので、
NXLogのログソースを"NXLog"の名前で統一させる。

次の条件でsyslog転送をする場合、下記の様なコンフィグとなる。
TCPで送信する場合はモジュールが"om_tcp"になるが、他の項目は全部同じとなる。

プロトコル:UDP
ログサーバ:192.168.0.1
ポート番号:514
アプリ名 :NXLog
Facility :local0
Severity :6
出力形式 :IETF形式(RFC5424)
 サンプルコンフィグ



C. 出力バッファ
転送先ログサーバが停止していると、syslogが送信出来なくなってログが欠落する。
ネットワークの瞬断レベルでも発生するので、ログ欠落を抑制する為にバッファリングを追加する。
バッファにはメモリ(主記憶)とHDD/SSD(補助記憶)の2種類があるが基本的にメモリバッファを利用する。
ログが膨大な環境では、メモリとHDD/SSDを併用する方法がドキュメントに記載されているが、
メモリが安い今なら、メモリを大量搭載しつつバッファ容量を拡張する方が安定動作しやすい。

パラメータはKByte換算となるので桁数に注意する。
128MByteのメモリバッファを確保しつつ、16MByteの利用でログ出力する設定は次の様になる。

 サンプルコンフィグ


セットアップ

1. インストール
WindowsにNXLogをインストールする時は、公式サイトのインストーラーを実行すれば完了する。
他のアプリケーション同様にライセンス承諾画面が出てくるので、
"I accept the terms in the License Agreement"のチェックボックスをクリックする。
 

nxlog_install_01.png



2. 起動方法
NXLogはサービスとして動作するので、Windows管理ツールからサービスを起動させる。
コントロールパネルから開くか、"ファイル名を指定して実行 > services.msc"で起動させる。
 

nxlog_install_02.png


コンフィグ

NXLogはセクション毎に設定を定義した後、Routeセクションで処理を連結する事でログを出力させ、
各セクションではログ送受信・文字列置換・バッファ・フィルタリングなどの細かい処理を定義する。
今回は自宅サーバで筆者が使っているコンフィグを元に、次の構成を取るサンプルコンフィグを紹介する。
 

nxlog_install_03.png

 
他サイトのサンプルではNXLog本体が出力するシステムログのローテートを書いていないが、
長期間運用するとシステムログも溜まっていくのでローテートした方が良い。
このシステムログのローテートも1週間毎・4ファイル保持の条件で設定した。

 サンプルコンフィグ

 
NXLogが出力したログをsyslogで受信すると次の様になる。
イベントログをJSON型に変換しているので、syslogで解釈出来る様に1行になって送られてくる。
NXLogで処理する前のログで改行は"\r\n"タブの箇所は"\t"の様に制御文字で置換される。

2021-02-01T18:00:00+09:00 windows NXLog[5000]: {"EventTime":"2021-02-01 18:00:00","Hostname":"windows","Keywords":2305800000000000000,"EventType":"INFO","SeverityValue":2,"Severity":"INFO","EventID":7002,"SourceName":"Microsoft-Windows-Winlogon","ProviderGuid":"{DBE9B383-0000-0000-0000-000000000000}","Version":0,"Task":1102,"OpcodeValue":0,"RecordNumber":61533,"ActivityID":"{9F41811A-1111-1111-1111-111111111111}","ProcessID":5000,"ThreadID":4000,"Channel":"System","Domain":"NT AUTHORITY","AccountName":"SYSTEM","UserID":"S-1-0-00","AccountType":"User","Message":"カスタマー エクスペリエンス向上プログラムのユーザー ログオフ通知","Opcode":"情報","TSId":"3","UserSid":"S-1-5-21-3333333333-3333333333-3333333333-3333","EventReceivedTime":"2021-02-01 18:00:00","SourceModuleName":"input_system","SourceModuleType":"im_msvistalog"}