2015年2月5日木曜日

[FIM]カスタム管理エージェントのトレースログを出力する

久しぶりにForefront Identity Manager(FIM)の話題です。
ID管理システムを構築する際、管理対象のすべてのシステムを製品に含まれる管理エージェントでまかなえることは稀だと思います。
FIMの場合、カスタムで管理エージェントを開発するためのECMA2というフレームワークが提供されており、各種システムとの柔軟な接続性を確保することができます。

カスタムで管理エージェントを開発する際、避けて通れないのがデバッグとトレース(ロギング)です。
デバッグについては別途紹介したいと思いますので、今回はトレースについてのポイント(TIPS)を少し紹介します。

トレースを行う方法も色々とあると思いますが、最近はプリセットのアダプタ群も対応しているEvent Tracing for Windows(ETW)を使うのが主流です。
(昔はMicrosoft.MetadirectoryServices.Loggingなんていうのもありましたが、最近はあまり使っていないような・・・。一応今でもあります、念のため)

 ETWトレース
  https://msdn.microsoft.com/ja-jp/library/vstudio/ms751538(v=vs.100).aspx
 Microsoft.MetadirectoryServices.Logging
  https://msdn.microsoft.com/en-us/library/microsoft.metadirectoryservices.logging.logging.aspx


ETWを使う場合、アプリケーション構成ファイル(hogehoge.exe.config)にSourceとListenerを記載すればモジュールに手を入れることなく、イベントログやテキストファイルなどへ柔軟にトレースを出力することが出来ます。
この時に注意すべきなのが、管理エージェントをFIM Sync(miisserver.exe)のプロセス内で動かすのか、別プロセスとして動かすのかによって使われるアプリケーション構成ファイルが異なる、ということです。


ここで「Run this management agent in a separate process」にチェックが入っているとFIM Sync(miisserver.exe)ではなく、独立したプロセス(dllhost.exe)で管理エージェントが実行されます。つまり、この場合はmiisserver.exeではなくdllhost.exeが使うアプリケーション構成ファイルにETWの設定をする必要があるのです。


それぞれの実行プロセスと構成ファイルは以下の通りです。

管理エージェント実行方法実行プロセス名アプリケーション構成ファイル
FIM Sync内miisserver.exeC:\Program Files\Microsoft Forefront Identity Manager\2010\Synchronization Service\Bin\miisserver.exe.config
別プロセスdllhost.exeC:\Program Files\Microsoft Forefront Identity Manager\2010\Synchronization Service\dllhost.exe.config




尚、設定する内容は同じなので、両方に同じことを書いておけばどちらのモデルで実行してもログの取り忘れはなくなるので、とりあえず両方に設定しておくのが良いかも知れません。



以下、具体的な設定方法です。

◆管理エージェント側
<必要な準備>
①#define TRACEを定義するか、コンパイルオプションに/d:TRACEを付けていること
②System.Diagnosticsをusingで定義
③TraceSourceオブジェクトインスタンスを生成

こんな感じで書きます。
#define TRACE
using System;
using Microsoft.MetadirectoryServices;
using System.Diagnostics;

namespace FimSync_Ezma
{
    public class EzmaExtension :
    IMAExtensible2CallExport,
    IMAExtensible2CallImport,
    IMAExtensible2GetSchema,
    IMAExtensible2GetCapabilities,
    IMAExtensible2GetParameters
    {
        // trace
        TraceSource traceSource = new TraceSource("sampleMA",SourceLevels.All);

※testma部分がアプリケーション構成ファイル内のSource Nameになります。SourceLevelについてはお好みで。

<トレース出力の例>
実際にトレースを出力したい箇所では以下のように書きます。
traceSource.TraceEvent(TraceEventType.Information, 0, "hogehoge");
traceSource.Flush();



◆アプリケーション構成ファイル側
テキストファイルに出力する例です。
initializeDataに対象ファイル名を記載します。
<system.diagnostics>      
   <sources>
       <source name="sampleMA" switchValue="All">
           <listeners>
               <add name="sampleMA"
                    type="System.Diagnostics.TextWriterTraceListener"
                    initializeData="c:\Logs\sampleMA_dllhost.log">
               <filter type="" />
               </add>
               <remove name="Default"/>
           </listeners>
       </source>
   </sources>
</system.diagnostics>





switchValueで出力レベルが変更できますので、開発中やデバッグ中は構成ファイル側でログレベルを上げておいて、平常時はレベルを落とすことで性能やディスク容量への影響を減らすことが出来ますので、うまく調整をしていきましょう。

0 件のコメント:

コメントを投稿