ようへいの日々精進XP

よかろうもん

Ruby スクリプトから Windows Server のイベントログにログを送る雑なメモ(2)〜 メッセージファイルを作成してメッセージ ID をレジストリに登録する等 〜

ども、初老丸です。

tl;dr

前の記事で RubyWindows 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 を使っている関係で上記のようなメッセージが出てしまう...のは解っていたので対処方法を試してみることにしたメモ。


参考


メモ

引き続き構成は...

f:id:inokara:20160206202300p:plain

イベントログにログを送る際に(本来であれば)やらなければいけないこと

ずばり...

  1. メッセージファイルと呼ばれるログメッセージを定義したファイルを作成
  2. mc.exeコンパイルしてリソーススクリプトを作成
  3. 作成したリソーススクリプトrc.exeコンパイルしてリソースファイルを作成
  4. 作成したリソースファイルを link.exe を使ってリンクして DLL を作成する
  5. 作成した 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:\path\to> 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:\path\to> 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:\path\to> 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:\path\to> ruby .\write.rb
Event source added to registry

レジストリを確認すると以下のように登録されている。

f:id:inokara:20160212235733p:plain

イベントログを投げてみる

前回のスクリプトを少しだけ修正。

実行すると以下のように出力される。

PS C:\path\to>
PS C:\path\to> 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

イベントビューワーで見ると以下のようにログが吐かれており、従来からの警告は出ていない。

f:id:inokara:20160213003214p:plain

おお。

おまけで CloudWatch Logs に転送してみる

イベントログに吐かれたアプリケーションログを CloudWatch Logs に送る場合には以下のように Flows ディレクティブに設定する。

        "Flows": {
            "Flows": 
            [
                "ApplicationEventLog, CloudWatchLogs02"
            ]
        }

設定後に EC2config サービスを再起動、しばらくすると以下のように...

f:id:inokara:20160213002052p:plain

おお。


ということで...

イベントログにログを ちゃんと 放り込みたい場合のにはメッセージファイルを作成してあらかじめメッセージ ID やメッセージ等を DLL を介してレジストリに登録する必要がある。DLL 作成については特に難しいことは無いと思われるので、オリジナルのアプリケーションをスクリプトで書いてログはイベントログに飛ばしたい場合等にはメッセージファイルの書き方等は覚えておきたい。

以上。