- 記事一覧 >
- ブログ記事
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」というサービスが登録されます。
設定ファイルは、
C:\Program Files (x86)\Common Files\syslogd\syslog.conf
です。
ログは、syslog.conf
のAction部分にログ名だけ記載した場合、C:\ProgramData\syslogd\ログ名
に出力されます。C:\ProgramData\syslogd
フォルダは、無い場合、自動的に作成されます。
ソースコードをビルド
オプション選択
プログラムメニューから Visual Studio Installer を起動します。
変更をクリックします。
「C++ によるデスクトップ開発」で、以下のようにオプションを有効にして、変更をクリックします。
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 を起動して、「コードなしで続行」をクリックします。
「拡張機能」→「拡張機能の管理」をクリックします。
右上の検索欄に"installer"と入力して、「Microsoft Visual Studio Installer Projects」をダウンロードします。
左下に「変更内容がスケジュールされます。すべての Microsoft Visual Studio ウィンドウを閉じると変更が開始されます。」と表示されますので、「閉じる」ボタンをクリックし、閉じます。さらに、Visual Studio 2019自体も閉じます。
Visual Studio 2019 を閉じると同時に拡張機能のインストールが始まりますので、「はい」をクリックします。
「Modify」をクリックします。
「Close」をクリックします。
リポジトリクローン
Visual Studio 2019 を起動して、リポジトリのクローンをクリックします。
「リポジトリの場所」にhttps://github.com/itc-lab/windows-syslogd
を入力します。
「パス」はどこでも良いですが、自動入力されます。
「クローン」をクリックします。
ビルド実行
「ファイル」→「開く」→「プロジェクト/ソリューション」をクリックします。
ntservice.sln
を選択します。
※今回の場合、フルパスは、C:\Users\admin\source\repos\windows-syslogd\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をダブルクリックしてインストールします。
C:\Program Files (x86)\Common Files\syslogd\syslogd.exe
にインストールされて、「Syslog Server」サービスを起動します。
※インストール直後は起動しているはずです。
設定ファイルは、C:\Program Files (x86)\Common Files\syslogd\syslog.conf
です。
syslog.confは、そのまま編集できないため、一旦Documentsなどにコピーして、編集後、C:\Program Files (x86)\Common Files\syslogd\syslog.conf
を上書きします。
*.* test.log
だけを設定したとします。
facility=local0
priority=info
を受信させると・・・
C:\ProgramData\syslogd
フォルダが作成されて、C:\ProgramData\syslogd\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出力
その他、宣伝、誹謗中傷等、当方が不適切と判断した書き込みは、理由の如何を問わず、投稿者に断りなく削除します。
書き込み内容について、一切の責任を負いません。
このコメント機能は、予告無く廃止する可能性があります。ご了承ください。
コメントの削除をご依頼の場合はTwitterのDM等でご連絡ください。