1. 記事一覧 >
  2. ブログ記事
category logo

Windows版syslogdサービスを作成した(C++)

(更新) (公開)

はじめに

Windows版syslogdを作成しました。サービスとして動作します。ソースコードは、GitHubに公開しました。
元々ルーターのログがWindowsに保存できたら良かったので、FreeBSD版syslogdを参考に実装しましたが、一部仕様と挙動が異なります。基本的な動作は問題無いという感じです。
Visual Studio 2019でのビルドから、どこまで実装されているか、紹介していきたいと思います。


【検証環境】

Windows Server 10 PRO 64ビット

 Visual Studio Community 2019


Windows版syslogd 概要

ソースコードは、こちらになります。

https://github.com/itc-lab/windows-syslogd


C:\Program Files (x86)\Common Files\syslogd\syslogd.exe にインストールされて、「Syslog Server」というサービスが登録されます。

「Syslog Server」サービス


設定ファイルは、 C:\Program Files (x86)\Common Files\syslogd\syslog.conf です。

syslog.conf


ログは、syslog.confのAction部分にログ名だけ記載した場合、
C:\ProgramData\syslogd\ログ名
に出力されます。
C:\ProgramData\syslogd フォルダは、無い場合、自動的に作成されます。

syslogdフォルダ


ソースコードをビルド

オプション選択

プログラムメニューから Visual Studio Installer を起動します。

Visual Studio Installer を起動


変更をクリックします。

Visual Studio Installer 変更をクリック


「C++ によるデスクトップ開発」で、以下のようにオプションを有効にして、変更をクリックします。

Visual Studio Installer オプションを有効


Visual Studio Community 2019 をインストールしていない時は、インストール時に上記オプションを聞かれます。
これを行わないと、ビルドの時、以下のエラーになり、怒られます。

重大度レベル    コード    説明    プロジェクト    ファイル    行    抑制状態
エラー    MSB8041    このプロジェクトには、MFC 個のライブラリが必要です。使用されているツールセットとアーキテクチャについては、Visual Studio インストーラー (個々のコンポーネント タブ) からインストールします。    syslogd    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppBuild.targets    479   
ビルドを開始しました...
1>------ ビルド開始: プロジェクト: syslogd, 構成: Debug Win32 ------
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppBuild.targets(479,5): error MSB8041: このプロジェクトには、MFC 個のライブラリが必要です。使用されているツールセットとアーキテクチャについては、Visual Studio インストーラー (個々のコンポーネント タブ) からインストールします。
1>プロジェクト "ntservice.vcxproj" のビルドが終了しました -- 失敗。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== 

拡張機能インストール

Visual Studio 2019 を起動して、「コードなしで続行」をクリックします。

Visual Studio 2019 コードなしで続行


「拡張機能」→「拡張機能の管理」をクリックします。

「拡張機能」→「拡張機能の管理」


右上の検索欄に"installer"と入力して、「Microsoft Visual Studio Installer Projects」をダウンロードします。

Microsoft Visual Studio Installer Projects


左下に「変更内容がスケジュールされます。すべての Microsoft Visual Studio ウィンドウを閉じると変更が開始されます。」と表示されますので、「閉じる」ボタンをクリックし、閉じます。さらに、Visual Studio 2019自体も閉じます。

Microsoft Visual Studio Installer Projects 閉じる


Visual Studio 2019 を閉じると同時に拡張機能のインストールが始まりますので、「はい」をクリックします。

拡張機能のインストール


「Modify」をクリックします。

「Modify」をクリック


「Close」をクリックします。

「Close」をクリック


リポジトリクローン

Visual Studio 2019 を起動して、リポジトリのクローンをクリックします。

リポジトリのクローン


「リポジトリの場所」に
https://github.com/itc-lab/windows-syslogd
を入力します。
「パス」はどこでも良いですが、自動入力されます。
「クローン」をクリックします。

リポジトリの場所


ビルド実行

「ファイル」→「開く」→「プロジェクト/ソリューション」をクリックします。

「ファイル」→「開く」→「プロジェクト/ソリューション」


ntservice.sln
を選択します。
※今回の場合、フルパスは、
C:\Users\admin\source\repos\windows-syslogd\ntservice.sln
でした。

ntservice.sln 選択


「ビルド」→「バッチ ビルド」をクリックします。

「ビルド」→「バッチ ビルド」をクリック


プロジェクト=setup、構成=Release
プロジェクト=syslogd、構成=Release
にチェックを入れて、「ビルド」をクリックします。

setupにチェック : msi を作成
sylogdにチェック : syslogd.exeをビルド
になります。

「ビルド」をクリック


C:\Users\admin\source\repos\windows-syslogd\setup\Release\syslogd.msi が作成されます。


なお、出力ウィンドウの方に以下のような出力がありますが、警告ですので、無視して構いません。

C:\Users\admin\source\repos\windows-syslogd\StdAfx.cpp(1,1): warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。

⇒BOM付UTF-8ではなく、BOM無しUTF-8だから出力されています。Visual Studioで直接コード編集すると、BOM付UTF-8になり、警告されません。特に支障は無く、無視します。


Building file 'C:\Users\admin\source\repos\windows-syslogd\setup\Release\syslogd.msi'...
WARNING: Could not find prerequisite 'Windows インストーラー 4.5
' in path 'C:\Program Files (x86)\Microsoft SDKs\ClickOnce Bootstrapper\'

⇒Prerequisites の「必須コンポーネントをインストールするセットアッププログラムを作成する」のチェックが不要でした。特に支障が無いため、無視します。

「必須コンポーネントをインストールするセットアッププログラムを作成する」のチェック


動作確認

msiをダブルクリックしてインストールします。

msiをダブルクリックしてインストール


C:\Program Files (x86)\Common Files\syslogd\syslogd.exe
にインストールされて、「Syslog Server」サービスを起動します。
※インストール直後は起動しているはずです。

「Syslog Server」サービスを起動


設定ファイルは、
C:\Program Files (x86)\Common Files\syslogd\syslog.conf です。
syslog.confは、そのまま編集できないため、一旦Documentsなどにコピーして、編集後、C:\Program Files (x86)\Common Files\syslogd\syslog.confを上書きします。

syslog.conf上書き


*.*    test.log

だけを設定したとします。


facility=local0
priority=info
を受信させると・・・


C:\ProgramData\syslogd フォルダが作成されて、
C:\ProgramData\syslogd\test.log
が出力されます。

test.log


ヨシ!


FreeBSD13のsyslogdとの違い

FreeBSD13のsyslogdの機能は、「FreeBSDのman syslog.confの内容をほぼ全部やってみた(意外な事実あり)」の記事で紹介しました。
この記事にある仕様がどこまでサポートされているか、以下に記載します。


機能対応
facility判定
特別な facility である mark×
priority level判定
include×
スペース/タブ区切り
大文字小文字(区別なし)
比較フラグ イコール =
比較フラグ > < => >= !×
program 指定×
!prog1,prog2×
!-prog1,prog2×
hostname 指定×
#+@ or +@×
+hostname1,hostname2×
-hostname1,hostname2×
プロパティベースのフィルタ×
フィルタリングリセット×
;セミコロン
facilityカンマ区切り
アスタリスク
none
;セミコロン 後優先
Action マイナス記号×
Action @で転送 ポート IPv6○(ポート IPv6は×)
Action ユーザー名×
Action パイプ×
#のエスケープ×

対応しているが動作が異なるもの

■facility=auth
FreeBSD版syslogdは、facility=auth が有効になりますが、Windows版syslogdは、facility=auth、facility=security 両方有効になります。


facility=auth、priority=emerg でメッセージ送信

【設定】
・FreeBSD

auth.=emerg        /var/log/auth.log
security.=emerg    /var/log/security.log

・Windows

auth.=emerg        auth.log
security.=emerg    security.log

【ログ出力】
・FreeBSD
/var/log/auth.log
・Windows
C:\ProgramData\syslogd\auth.log と C:\ProgramData\syslogd\security.log


■facility=kern
FreeBSD版syslogdは、facility=user が有効になりますが、Windows版syslogdは、facility=kern が有効になります。


facility=kern、priority=emerg でメッセージ送信

【設定】
・FreeBSD

kern.=emerg       /var/log/kern.log
user.=emerg       /var/log/user.log

・Windows

kern.=emerg           kern.log
user.=emerg           user.log

【ログ出力】
・FreeBSD
/var/log/user.log

・Windows
C:\ProgramData\syslogd\kern.log


■facility=mark
FreeBSD版syslogdは、facility=user が有効になりますが、Windows版syslogdは、facility=kern が有効になります。
注意:直接メッセージを送信するのは、本来の使い方ではないと思われます。


facility=mark、priority=alert でメッセージ送信

【設定】
・FreeBSD

mark.=alert       /var/log/mark.log
kern.=alert       /var/log/kern.log
user.=alert       /var/log/user.log

・Windows

mark.=alert           mark.log
kern.=alert           kern.log
user.=alert           user.log

【ログ出力】
・FreeBSD
/var/log/user.log

・Windows
C:\ProgramData\syslogd\kern.log


■facility=security
FreeBSD版syslogdは、facility=auth が有効になりますが、Windows版syslogdは、facility=auth、facility=security 両方有効になります。


facility=security、priority=emerg でメッセージ送信

【設定】
・FreeBSD

auth.=emerg        /var/log/auth.log
security.=emerg    /var/log/security.log

・Windows

auth.=emerg        auth.log
security.=emerg    security.log

【ログ出力】
・FreeBSD
/var/log/auth.log

・Windows
C:\ProgramData\syslogd\auth.logとC:\ProgramData\syslogd\security.log


■mail.crit,*.err(バグ) FreeBSD版syslogdとWindows版syslogdでは、結果が異なりました。
【設定】
・FreeBSD

mail.crit,*.err    /var/log/bug.log

・Windows

mail.crit,*.err    bug.log

【結果】
・FreeBSD
facility=mail, priority=crit→/var/log/bug.log出力
facility=mail, priority=err→/var/log/bug.log出力
facility=mail, priority=notice→出力無し
facility=local0, priority=crit→/var/log/bug.log出力
facility=local0, priority=err→/var/log/bug.log出力
facility=local0, priority=notice→出力無し

・Windows
facility=mail, priority=crit→出力無し
facility=mail, priority=err→出力無し
facility=mail, priority=notice→出力無し
facility=local0, priority=crit→出力無し
facility=local0, priority=err→出力無し
facility=local0, priority=notice→出力無し


【設定】
・FreeBSD

mail.*,*.crit    /var/log/bug.log

・Windows

mail.*,*.crit    bug.log

【結果】
・FreeBSD
facility=mail, priority=crit→/var/log/bug.log出力
facility=mail, priority=err→出力無し
facility=mail, priority=notice→出力無し
facility=local0, priority=crit→/var/log/bug.log出力
facility=local0, priority=err→出力無し
facility=local0, priority=notice→出力無し

・Windows
facility=mail, priority=crit→bug.log出力
facility=mail, priority=err→bug.log出力
facility=mail, priority=notice→bug.log出力
facility=local0, priority=crit→bug.log出力
facility=local0, priority=err→出力無し
facility=local0, priority=notice→出力無し


Windows版syslogdだけの仕様

Windows版syslogdだけの仕様として、設定に環境変数を使用できます。
syslog.confに%環境変数%と記述すると、全環境変数を取得して、大小文字の区別なしで置換します。
※ログインユーザの環境変数ではなく、Local System の環境変数になります。


【設定】

*.=notice    rtx1200_notice.%Date%.log
*.=info	     rtx1200_info.%Date%.log

【結果】
facility=local0, priority=notice→rtx1200_notice.[YYYYMMDD].log出力
facility=local0, priority=info→rtx1200_info.[YYYYMMDD].log出力
facility=local0, priority=debug→出力無し
facility=local1, priority=notice→rtx1200_notice.[YYYYMMDD].log出力
facility=local1, priority=info→rtx1200_info.[YYYYMMDD].log出力
facility=local1, priority=debug→出力無し


【設定】

local0.*    %ProgramData%\local0.log

【結果】
facility=local0, priority=notice→C:\ProgramData\local0.log出力
facility=local0, priority=info→C:\ProgramData\local0.log出力
facility=local0, priority=debug→C:\ProgramData\local0.log出力

loading...