ども、初老丸です。
tl;dr
前の記事で Ruby で Windows Server のイベントログにログを送ることが出来た。出来たように見えて、ログを CloudWatch Logs に飛ばしてみると以下のようなログが記録されるだけ。
[Application] [Information] [65500] [Application] [WIN-xxxxxxxxxxxxxxxxx] [The description for Event cannot be found. Either the component that raises this event is not installed on your local computer or the installation is corrupted. You can install or repair the component on the local computer.]
オリジナルのイベント ID を使っている関係で上記のようなメッセージが出てしまう…のは解っていたので対処方法を試してみることにしたメモ。
参考
- win32-eventlog/tutorial.txt at ffi2 · djberg96/win32-eventlog · GitHub
- 【VisualStudio】メッセージファイル DLLの作成方法 ( ソフトウェア ) – プログラム の個人的なメモ – Yahoo!ブログ
- イベントログで使うメッセージファイル DLLを作成する | re-Think things
- イベントログにメッセージを出力する
- Message Text Files (Windows)
メモ
引き続き構成は…
イベントログにログを送る際に(本来であれば)やらなければいけないこと
ずばり…
- メッセージファイルと呼ばれるログメッセージを定義したファイルを作成
mc.exe
でコンパイルしてリソーススクリプトを作成- 作成したリソーススクリプトを
rc.exe
でコンパイルしてリソースファイルを作成 - 作成したリソースファイルを
link.exe
を使ってリンクして DLL 1. 作成した DLL をレジストリに登録する
うお…難しそう。
mc.exe とか rc.exe とか…の準備
mc.exe
ま Message Compiler の略称らしい。これらのツールは Microsoft Windows SDK をインストールすると一緒にインストールされるので Microsoft Windows SDK をインストールしておく。
今回は Windows Server 2012 R2 を利用しているが、インストールしただけではパスが通っていなかったので適宜パスを通しておく。
メッセージファイルの作成
こちらより抜粋。
; ; Message ID = 65500 ; MessageId=0x0000ffdc Language=English info: %1 . ; ; Message ID = 65501 ; MessageId=0x0000ffdd Language=English warning: %1 . ; ; Message ID = 65502 ; MessageId=0x0000ffde Language=English error: %1 .
ファイルを oreno.mc として保存。
詳細なフォーマットについてはこちらを。
メッセージファイルをコンパイル
mc oreno.mc
実行すると以下のように出力される。
PS C:pathto> mc oreno.mc MC: Compiling oreno.mc
以下のようなファイルが作成される。
----- 2/12/2016 2:36 PM 1211 oreno.h ----- 2/12/2016 2:36 PM 39 oreno.rc
リソーススクリプトとリソースファイルの作成
上記で作成した oreno.rc を利用してリソースファイルを作成する。
rc -r -fo oreno.res oreno.rc
実行すると以下のように出力される。
PS C:pathto> rc -r -fo oreno.res oreno.rc Microsoft (R) Windows (R) Resource Compiler Version 6.1.7600.16385 Copyright (C) Microsoft Corporation. All rights reserved.
以下のようなファイルが作成される。
-a--- 2/12/2016 2:40 PM 168 oreno.res
リソースファイルをリンクして DLL を作成
上記で作成した oreno.res を利用して DLL ファイルを作成する。
link -dll -noentry -out:oreno.dll oreno.res
実行すると以下のように出力される。
PS C:pathto> link -dll -noentry -out:oreno.dll oreno.res Microsoft (R) Incremental Linker Version 10.00.30319.01 Copyright (C) Microsoft Corporation. All rights reserved. LINK : warning LNK4068: /MACHINE not specified; defaulting to X64
以下のようなファイルが作成される。
-a--- 2/12/2016 2:45 PM 1024 oreno.dll
DLL をレジストリに登録する
win32-eventlog に同梱されている win32/mc を利用して上記で作成した oreno.dll をレジストリに登録する。
require "win32/eventlog" require "win32/mc" include Win32 dll_file = 'C:\path\to\oreno.dll' EventLog.add_event_source( 'source' => "Application", 'key_name' => "oreno-app", 'category_count' => 2, 'event_message_file' => dll_file, 'category_message_file' => dll_file ) puts "Event source added to registry"
実行すると以下のように出力される。
PS C:pathto> ruby .write.rb Event source added to registry
レジストリを確認すると以下のように登録されている。
イベントログを投げてみる
前回のスクリプトを少しだけ修正。
実行すると以下のように出力される。
PS C:pathto> PS C:pathto> ruby .test.rb Starting Oreno Service ... Komanechi!! at 2016/02/12 15:07:14 Komanechi!! at 2016/02/12 15:08:14 Komanechi!! at 2016/02/12 15:09:14
イベントビューワーで見ると以下のようにログが吐かれており、従来からの警告は出ていない。
おお。
おまけで CloudWatch Logs に転送してみる
イベントログに吐かれたアプリケーションログを CloudWatch Logs に送る場合には以下のように Flows ディレクティブに設定する。
"Flows": { "Flows": [ "ApplicationEventLog, CloudWatchLogs02" ] }
設定後に EC2config サービスを再起動、しばらくすると以下のように…
おお。
ということで…
イベントログにログを ちゃんと
放り込みたい場合のにはメッセージファイルを作成してあらかじめメッセージ ID やメッセージ等を DLL を介してレジストリに登録する必要がある。DLL 作成については特に難しいことは無いと思われるので、オリジナルのアプリケーションをスクリプトで書いてログはイベントログに飛ばしたい場合等にはメッセージファイルの書き方等は覚えておきたい。
以上。
元記事はこちら
「Ruby スクリプトから Windows Server のイベントログにログを送る雑なメモ(2)〜 メッセージファイルを作成してメッセージ ID をレジストリに登録する等 〜」