お金をかけずにサーバーの勉強をしよう

Windowsのログを Linuxサーバーに集約

2025年7月11日

メニューへ戻る

余りニーズがあるようには思えませんが、Windows Serverのイベントログを Ubuntu Serverに転送する構成を作ってみます。

Windowsサーバーに限らず、複数のサーバーがあってそのログを見なければいけない仕事で、複数のサーバーに一々ログインして見ていくのは面倒なので、一箇所に纏めてしまえば手間が減るという寸法です。

fluentdなど高機能なものも存在しますが、ここではなるべくOSにある機能を使う、インストールするものをなるべく減らす、そういう観点で以下の構成でやってみます。


1.環境

ノードの構成はこのように。

rsyslogdは Linux OS内で発生するログを集約してテキストファイルに出力してくれます。

rsyslogの仕組みについてはさくらインターネットのブログに分かりやすく書かれていて、昔お世話になりました。
多機能なログ管理システム「rsyslog」の基本的な設定

ただこれでも難しいので以下の絵で。
さくらのブログにも似た絵があったと思います。

rsyslogは大まかに 3つの機能に分かれているというのはこういうことです。
入力方法(機能1)にいくつものものが用意されていて、入力されたものを編集(機能2)し、出力方法(機能3)にもいくつものものが用意されています。

これらを好きに組み合わせて、入ってきたデータ(ログ)を編集してから出してやることができます。
rsyslogの仕組み 1

rsyslogは OSインストール直後はこんな組み合わせで、あるプログラム(journald)からの出力を拾って、[/var/log/syslog]ファイルに書き出しています。
rsyslogの仕組み 2

ところで、syslogというのは RFC5424 で定義されていまして、基本的には 1件のログが 1行のテキストであると考えて下さい。
syslogの書式は「6. Syslog Message Format」に定義されていますので、詳しく知りたい方は読んでみて下さい。

とりあえずは「日時とホスト名とログ自体が入ってる 1行」くらいに捉えておけば良かろうと思います。

Ubuntu Serverのインストールについては「Ubuntu 24.04 Server インストール」に、
Windows Serverのインストールについては「Windows Server 2025 インストール」にそれぞれ書いています。

両方を作った所からスタートします。


2.受信側(Ubuntu Server & rsyslogd)の設定

rsyslogdは Ubuntuではデフォルトでインストールされていて、Ubuntu以外のほとんどのディストリビューションでも起動時から動いていると思います。

rsyslogdはネットワークを通じて外部ノードからのデータを受ける機能がありますがデフォルト設定ではこれが有効になっていません。

rsyslogdの設定ファイル [/etc/rsyslog.conf] を編集してこれを有効にします。
[514/udp] で外部からのデータを待ち受けるようにするため、ピンク色の箇所のコメントアウトを解除(#を取る)します。

# /etc/rsyslog.conf configuration file for rsyslog
#
# For more information install rsyslog-doc and see
# /usr/share/doc/rsyslog-doc/html/configuration/index.html
#
# Default logging rules can be found in /etc/rsyslog.d/50-default.conf


#################
#### MODULES ####
#################

module(load="imuxsock") # provides support for local system logging
#module(load="immark")  # provides --MARK-- message capability

# provides UDP syslog reception
#module(load="imudp")
#input(type="imudp" port="514")
  ↓
module(load="imudp")
input(type="imudp" port="514")

# provides TCP syslog reception
#module(load="imtcp")
#input(type="imtcp" port="514")

# provides kernel logging support and enable non-kernel klog messages
module(load="imklog" permitnonkernelfacility="on")

###########################
#### GLOBAL DIRECTIVES ####
###########################

# Filter duplicated messages
$RepeatedMsgReduction on

#
# Set the default permissions for all log files.
#
$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
$PrivDropToUser syslog
$PrivDropToGroup syslog

#
# Where to place spool and state files
#
$WorkDirectory /var/spool/rsyslog

#
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /etc/rsyslog.d/*.conf

rsyslogを再起動します。

subro@Ubuntu2404-1:~$ sudo systemctl restart rsyslog

ssコマンド(another utility to investigate sockets)で [514/udp] で待ち受けているか確認します。

subro@Ubuntu2404-1:~$ sudo ss -anup
State        Recv-Q       Send-Q                      Local Address:Port     Peer Address:Port       Process
UNCONN       0            0                                 0.0.0.0:514           0.0.0.0:*          users:(("rsyslogd",pid=888,fd=5))
UNCONN       0            0                               127.0.0.54:53           0.0.0.0:*          users:(("systemd-resolve",pid=696,fd=16))
UNCONN       0            0                           127.0.0.53%lo:53            0.0.0.0:*          users:(("systemd-resolve",pid=696,fd=14))
UNCONN       0            0                                    [::]:514              [::]:*          users:(("rsyslogd",pid=888,fd=6))
UNCONN       0            0          [fe80::20c:29ff:fe53:54]%ens32:546              [::]:*          users:(("systemd-network",pid=667,fd=22))

これで rsyslog側は OKです。


3.NXLogダウンロード&インストール

Windowsサーバーには NXLogというツールをインストールします。
これは Windows版 rsyslogdのようなものです。
NXLog

NXLogには有償の Enterprise Editionと無償で使える Community Editionがあり、ここでは Community Editionをインストールします。

ダウンロードはこちら
(要アカウント作成)
Download

こちらに各種OS用のインストールファイルが並んでいますので、Windows用(x86-64)で最新のバージョンを入手しましょう。
2025年7月11日時点では [nxlog-ce-3.2.2329.msi] が最新のものでした。

入手したファイルは Windows Server 2025にコピーしておいて下さい。

[nxlog-ce-3.2.2329.msi] をダブルクリックして実行します。

Nextを押します。
NXLog Community Edition インストール 1

[I accept the terms in the Licnese Agreement] にチェックを入れ、Nextを押します。
NXLog Community Edition インストール 2

Nextを押します、
NXLog Community Edition インストール 3

Installを押します。
NXLog Community Edition インストール 4

Finishを押します。
NXLog Community Edition インストール 5

インストールできました。


4.送信側(Windows Server & NXLog)の設定

NXLogの設定ファイルは [C:¥Program Files¥nxlog¥conf¥nxlog.conf] です。
これを以下のように書き換えます。
海外のサイトからパクったものですがオリジナルがどこだったか忘れてしまいました。

水色の所が イベントログに関する記述で、昔の Windowsからあった Application/Security/System の各イベントログが対象になっていますが、他のイベントログも対象にすることができます。
ピンク色の所が Ubuntu Server の rsyslogへネットワーク経由で転送する部分です。

Panic Soft
#NoFreeOnExit TRUE

define ROOT     C:\Program Files\nxlog
define CERTDIR  %ROOT%\cert
define CONFDIR  %ROOT%\conf
define LOGDIR   %ROOT%\data
define LOGFILE  %LOGDIR%\nxlog.log
LogFile %LOGFILE%

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

# Include fileop while debugging, also enable in the output module below
#<Extension fileop>
# Module xm_fileop
#</Extension>

<Extension json>
  Module xm_json
</Extension>

<Extension syslog>
  Module xm_syslog
</Extension>

<Input internal>
  Module im_internal
  Exec $Message = to_json();
</Input>

# Windows Event Log
<Input eventlog>
  # Uncomment im_msvistalog for Windows Vista/2008 and later
  Module im_msvistalog
  Query <QueryList>\
    <Query Id="0">\
      <Select Path="Application">*[System[(Level=1 or Level=2 or Level=3)]]</Select>\
      <Select Path="System">*[System[(Level=1 or Level=2 or Level=3)]]</Select>\
      <Select Path="Security">*[System[(Level=1 or Level=2 or Level=3)]]</Select>\
    </Query>\
  </QueryList>

  #Uncomment im_mseventlog for Windows XP/2000/2003
  #Module im_mseventlog
  Exec $Message = to_json();
</Input>

<Processor buffer>
  Module pm_buffer
  # 100Mb disk buffer
  MaxSize 102400
  Type disk
</Processor>

<Output out>
  Module om_udp
  Host 192.168.1.103 ←Ubuntu ServerのIPアドレスです
  Port 514

  Exec to_syslog_ietf();
  Exec $raw_event =~ s/(\[.*])//g; $raw_event = replace($raw_event, '{', '[tag="windows"] {', 1);

  #Use the following line for debugging (uncomment the fileop extension above as well)
  #Exec file_write("C:\\Program Files\\nxlog\\data\\nxlog_output.log", $raw_event);
</Output>

<Route 1>
  Path internal, eventlog => buffer => out
</Route>

Windows Serverのイベントログファイルはツリー構造のデータを持つバイナリファイルですが、テキスト化・JSON化・syslogフォーマット化を NXLogで行い、UDPで Ubuntu Serverの IPである [192.168.1.103] へ送信するようにしています。

[nxlog]サービスを再起動します。
コマンドプロンプトで以下を実行します。

C:\Users\Administrator>sc stop nxlog

SERVICE_NAME: nxlog
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 1  STOPPED
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

C:\Users\Administrator>sc start nxlog

SERVICE_NAME: nxlog
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 2  START_PENDING
                                (NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x7d0
        PID                : 7440
        FLAGS              :

再起動しました。

この結果、Windows Server側の NXLogと Ubuntu Server側の rsyslogの関係はこんな感じになります。
rsyslogの仕組み 3


5.Ubuntu Serverに収集された Windows Serverのイベントログ

この結果、Ubuntu Serverの [/var/log/syslog]ファイルに出てきたログの例がこちら。

2025-07-11T20:11:25.584524+09:00 ubuntuserver2404-1 systemd[1]: systemd-tmpfiles-clean.service: Deactivated successfully.
2025-07-11T20:11:25.584765+09:00 ubuntuserver2404-1 systemd[1]: Finished systemd-tmpfiles-clean.service - Cleanup of Temporary Directories.
2025-07-11T20:12:05.681349+09:00 WIN2025-1 nxlog-ce[7440] [tag="windows"] {"EventTime":"2025-07-11 20:12:05","Hostname":"WIN2025-1","SeverityValue":3,"Severity":"WARNING","SourceName":"nxlog-ce","ProcessID":7440,"Message":"received a system shutdown request","EventReceivedTime":"2025-07-11 20:12:05","SourceModuleName":"internal","SourceModuleType":"im_internal"}
2025-07-11T20:12:05.681701+09:00 WIN2025-1 nxlog-ce[7440] [tag="windows"] {"EventTime":"2025-07-11 20:12:05","Hostname":"WIN2025-1","SeverityValue":3,"Severity":"WARNING","SourceName":"nxlog-ce","ProcessID":7440,"Message":"stopping nxlog service","EventReceivedTime":"2025-07-11 20:12:05","SourceModuleName":"internal","SourceModuleType":"im_internal"}
2025-07-11T20:12:05.688309+09:00 WIN2025-1 nxlog-ce[7440] [tag="windows"] {"EventTime":"2025-07-11 20:12:05","Hostname":"WIN2025-1","SeverityValue":3,"Severity":"WARNING","SourceName":"nxlog-ce","ProcessID":7440,"Message":"nxlog-ce received a termination request signal, exiting...","EventReceivedTime":"2025-07-11 20:12:05","SourceModuleName":"internal","SourceModuleType":"im_internal"}
2025-07-11T20:14:20.134568+09:00 WIN2025-1 nxlog-ce[716] [tag="windows"] {"EventTime":"2025-07-11 20:14:20","Hostname":"WIN2025-1","SeverityValue":2,"Severity":"INFO","SourceName":"nxlog-ce","ProcessID":716,"Message":"nxlog-ce-3.2.2329 started","EventReceivedTime":"2025-07-11 20:14:20","SourceModuleName":"internal","SourceModuleType":"im_internal"}
2025-07-11T20:14:24.661992+09:00 ubuntuserver2404-1 systemd[1361]: launchpadlib-cache-clean.service - Clean up old files in the Launchpadlib cache was skipped because of an unmet condition check (ConditionPathExists=/home/subro/.launchpadlib/api.launchpad.net/cache).

1・2行目は Ubuntu Serverのカーネルメッセージで Windowsのものではありませんが、これも rsyslogを経由して出てきたものです。。

3〜6行目が Windows Serverの SYSTEMイベントログで、NXLogが syslogフォーマット(かつメッセージ部分を JSONにしている)にしてネットワーク越しに転送してきたものです。

この例では Ubuntu Serverの rsyslogの出力先はデフォルトの [/var/log/syslog]ファイルのままにしているので、Ubuntu Serverのログも Windows Serverのイベントログも一緒になってしまっていますが、rsyslogの設定でマシン名毎に別ファイルにすることもできます。


==========
rsyslog・NXLogともに便利な機能を多く持っており、また入力元/出力先とも色々なものと連携することができます。

NXLogについては、英語ですがドキュメントが充実しているのでそちらを参照されると良いと思います。
NXLog Documentation

但し入力/出力の機能で美味しいもの、例えば有償のデータベースとの連携などは、残念ながら有償のエディションに限定されています。
(そういう収益モデルなんですね)

Windowsイベントログを syslog形式にして、Linuxの rsyslogに集約しようと思ったのは、Windowsサーバーと Linuxサーバーが混在している環境で、一元的なログ管理やログ監視をしたかったからです。

今回は Windows → Linux への集約で設計してみましたが、NXlogがあれば逆のパターンも行けそうです。

問題は Windowsイベントログがバイナリ形式の構造化ログであり、Linuxの syslogが 1行のテキストログであるということです。

この表現方法の異なるログをどう一元管理するかを説明した例が余り無く、鉄板的な方法論も確立していないと思われ、個々の運用エンジニアの力量に任せられているところなので工夫のし甲斐があるのですが、難しい所とも言えますね。

ワタクシ個人的には、ここで書いた方法が好きです。


rsyslogの本はこれだけ。なくならない内にゲットしないと。
もう電子書籍でないと手に入らないかも…