#author("2022-08-26T21:29:15+09:00","default:nowsky","nowsky")
*NXLog [#e5ccd99d]
-[[NXLog:+https://nxlog.co/]]
-[[NXLog Community Edition Reference Manual:+https://nxlog.co/docs/nxlog-ce/nxlog-reference-manual.html]]

ヨーロッパのNXLog社が開発しているロギングプログラムで、
無料のNXLog Community Edition・有料のNXLog Enterprise Editionが存在する。
Linux・Windows・macOSなど様々なプラットフォームで動作する上、
&color(#ff0000){Windowsイベントログのフィルタリングとsyslog転送};が出来る。
~
*参考サイト [#z9d75f92]
-猫のプロトコル:[[nxlogを使用してsyslog-ngにログの集約:+https://protocol.nekono.tokyo/2016/07/13/nxlog%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6syslog-ng%E3%81%AB%E3%83%AD%E3%82%B0%E3%81%AE%E9%9B%86%E7%B4%84/]]
-Qiita:[[【Windows】イベントログをLinuxに転送する:+https://qiita.com/dan-go/items/d7d525ec44cff939c2d4]]
-機器・サーバー監視のへや:[[フリー版でできるリアルタイムログ監視 #5 - Windowsイベントログの監視:+https://jtc-networkmanagementmaster.blogspot.com/2018/12/nls-realtime-log-monitoring-05.html]]
-CLOUDLYTICS:[[Integrating Windows Events:+https://cloudlytics.com/articles/integrating-windows-events/]]
~
*設定ポイント [#r71c16d4]
&size(16){&font(b){A. データソース数};};
WindowsServer2016のイベントログソース数は256種を超えるが、
NXLog-CEではログソース256種を超える事が出来ない。
IISやADドメコン等のWindowsServerサービスを構築した際も簡単に256種を超えるので注意が必要となる。
ログソース数の制限を突破した状態でNXLogを起動すると、
NXLog本体のログに制限突破のwarningが出力されつつ256種目以上のログが取得出来なくなる。
問題を回避するには、OSの出力するイベントログを減らすか、NXLogで取得するログを種類毎に分割する。

-[[Latest nxlog-ce formally supports Windows Server 2016 ? / solved 256 sources limitation?:+https://nxlog.co/question/4228/latest-nxlog-ce-formally-supports-windows-server-2016-solved-256-sources-limitation]]

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

 PS > Get-EventLog -list | Select -Property Log
 
レベルはWindowsの[[イベントログ需要度レベル:+https://docs.microsoft.com/ja-jp/previous-versions/office/developer/sharepoint-2010/ff604025(v=office.14)]]に合わせて重要度を数値で指定する。
または、Microsoftの[[Windows Event Selection:+https://docs.microsoft.com/en-us/previous-versions//aa385231(v=vs.85)?redirectedfrom=MSDN]]に従ってクエリを作る。

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

#region(&color(#ff0000){サンプルコンフィグ};)
 <Input input_application>
     Module im_msvistalog
     Query <QueryList><Query Id="0"><Select Path="Application">*</Select></Query></QueryList>
     <Exec>
         $Message  = to_json();
         $Hostname = hostname();
     </Exec>
 </Input>
 
 <Input input_security>
     Module im_msvistalog
     Query <QueryList><Query Id="0"><Select Path="Security">*[System/Level=1]</Select></Query></QueryList>
     <Exec>
         $Message  = to_json();
         $Hostname = hostname();
     </Exec>
 </Input>
 
 <Input input_system>
     Module im_msvistalog
     Query <QueryList><Query Id="0"><Select Path="System">*[System[(Level=1 or Level=2 or Level=3)]]</Select></Query></QueryList>
     <Exec>
         $Message  = to_json();
         $Hostname = hostname();
     </Exec>
 </Input>
#endregion
~
&size(16){&font(b){B. syslog転送};};
NXLogからsyslog転送する時に、BSD-Syslog/IETF-Syslog何れかのフォーマットで出力すると、
&color(#ff0000){Facility:User(5)/Severity:Notice(5)};で送信する。
このままだとログサーバでフィルタリングしにくいので、
ログ出力セクションでFacilityとSeverityを上書きして任意の値で転送する。
 
デフォルトではsyslogのプログラム名が、イベントログのアプリケーションソース名で可変となる。
このままだとログサーバでアプリケーション毎の出力振分けが出来なくなるので、
NXLogのログソースを"NXLog"の名前で統一させる。

-[[NXLog User Guide / Syslog(xm_syslog):+https://nxlog.co/documentation/nxlog-user-guide/xm_syslog.html]]

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

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

#region(&color(#ff0000){サンプルコンフィグ};)
 <Output output_syslog>
     Module om_udp
     Host 192.168.0.1
     Port 514
     <Exec>
         $SourceName          = 'NXLog';
         $SyslogFacility      = 'local0';
         $SyslogSeverityValue = '6';
         to_syslog_ietf();
     </Exec>
 </Output>
#endregion
~
&size(16){&font(b){C. 出力バッファ};};
転送先ログサーバが停止していると、syslogが送信出来なくなってログが欠落する。
ネットワークの瞬断レベルでも発生するので、ログ欠落を抑制する為にバッファリングを追加する。
バッファにはメモリ(主記憶)とHDD/SSD(補助記憶)の2種類があるが基本的にメモリバッファを利用する。
ログが膨大な環境では、メモリとHDD/SSDを併用する方法がドキュメントに記載されているが、
メモリが安い今なら、メモリを大量搭載しつつバッファ容量を拡張する方が安定動作しやすい。

-[[NXLog User Guide / Using Buffers:+https://nxlog.co/documentation/nxlog-user-guide/using-buffers.html]]

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

#region(&color(#ff0000){サンプルコンフィグ};)
 <Processor buffer_memory>
     Module pm_buffer
     Type Mem
     MaxSize 128000
     WarnLimit 16000
 </Processor>
#endregion
~
*セットアップ [#f6de8ca3]
&size(16){&font(b){1. インストール};};
WindowsにNXLogをインストールする時は、公式サイトのインストーラーを実行すれば完了する。
他のアプリケーション同様にライセンス承諾画面が出てくるので、
&font(b){"I accept the terms in the License Agreement"};のチェックボックスをクリックする。
 
|&ref(nxlog_install_01.png,left,nowrap,zoom,400x600);|
~
&size(16){&font(b){2. 起動方法};};
NXLogはサービスとして動作するので、Windows管理ツールからサービスを起動させる。
コントロールパネルから開くか、&color(#ff0000){"ファイル名を指定して実行 > services.msc"};で起動させる。
 
|&ref(nxlog_install_02.png,left,nowrap,zoom,400x600);|
~
*コンフィグ [#za2662a5]
NXLogはセクション毎に設定を定義した後、Routeセクションで処理を連結する事でログを出力させ、
各セクションではログ送受信・文字列置換・バッファ・フィルタリングなどの細かい処理を定義する。
今回は自宅サーバで筆者が使っているコンフィグを元に、次の構成を取るサンプルコンフィグを紹介する。
 
|&ref(nxlog_install_03.png,left,nowrap,50%);|
 
他サイトのサンプルではNXLog本体が出力するシステムログのローテートを書いていないが、
長期間運用するとシステムログも溜まっていくのでローテートした方が良い。
このシステムログのローテートも1週間毎・4ファイル保持の条件で設定した。

#region(&color(#ff0000){サンプルコンフィグ};)
 # NXLog Community Edition configuration file
 #
 # For more information see "C:\Program Files (x86)\nxlog\conf\nxlog.conf"
 # or latest version online at https://nxlog.co/docs/nxlog-ce/nxlog-reference-manual.html
 # If you experience problems, see https://nxlog.co/community-forum
 
 
 #### DEFINE ####
 
 define ROOT    C:\Program Files (x86)\nxlog
 define CERTDIR %ROOT%\cert
 define CONFDIR %ROOT%\conf
 define LOGDIR  %ROOT%\data
 define LOGFILE %LOGDIR%\nxlog.log
 
 Moduledir %ROOT%\modules
 CacheDir  %ROOT%\data
 Pidfile   %ROOT%\data\nxlog.pid
 SpoolDir  %ROOT%\data
 LogFile   %LOGFILE%
 
 
 #### EXTENSION ####
 
 <Extension exec>
     Module xm_exec
 </Extension>
 
 <Extension json>
     Module xm_json
 </Extension>
 
 <Extension syslog>
     Module xm_syslog
 </Extension>
 
 <Extension charconv>
     Module xm_charconv
     AutodetectCharsets shift_jis, utf-8
 </Extension>
 
 <Extension fileop>
     Module xm_fileop
     <Schedule>
         Every 1 week
         <Exec>
             file_cycle('%LOGFILE%', 4);
         </Exec>
     </Schedule>
 </Extension>
 
 
 #### INPUT SECTION ####
 
 <Input input_application>
     Module im_msvistalog
     Query <QueryList><Query Id="0"><Select Path="Application">*</Select></Query></QueryList>
     <Exec>
         $Message  = to_json();
         $Hostname = hostname();
     </Exec>
 </Input>
 
 <Input input_security>
     Module im_msvistalog
     Query <QueryList><Query Id="0"><Select Path="Security">*</Select></Query></QueryList>
     <Exec>
         $Message  = to_json();
         $Hostname = hostname();
     </Exec>
 </Input>
 
 <Input input_system>
     Module im_msvistalog
     Query <QueryList><Query Id="0"><Select Path="System">*</Select></Query></QueryList>
     <Exec>
         $Message  = to_json();
         $Hostname = hostname();
     </Exec>
 </Input>
 
 
 #### PROCESSOR SECTION ####
 
 <Processor buffer_memory>
     Module pm_buffer
     Type Mem
     MaxSize 128000
     WarnLimit 16000
 </Processor>
 
 
 #### OUTPUT SECTION ####
 
 <Output output_syslog>
     Module om_udp
     Host 192.168.0.1
     Port 514
     <Exec>
         $SourceName          = 'NXLog';
         $SyslogFacility      = 'local0';
         $SyslogSeverityValue = '6';
         to_syslog_ietf();
     </Exec>
 </Output>
 
 
 #### ROUTE SECTION ####
 
 <Route route_application>
     path input_application => buffer_memory => output_syslog
 </Route>
 
 <Route route_security>
     path input_security => buffer_memory => output_syslog
 </Route>
 
 <Route route_system>
     path input_system => buffer_memory => output_syslog
 </Route>
#endregion
 
NXLogが出力したログをsyslogで受信すると次の様になる。
イベントログをJSON型に変換しているので、syslogで解釈出来る様に1行になって送られてくる。
NXLogで処理する前のログで&color(#ff0000){改行は"\r\n"};、&color(#ff0000){タブの箇所は"\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"}