連載
Enterprise Library概説

拡張性と使いやすさを併せ持つログ出力機能を実装しよう

市川 龍太(patterns & practices Champion
2005/08/27
Page1 Page2 Page3

例外発生時のエラー情報を出力する

●テキスト・ファイルへ出力する

 以下は前回の「Data Access Application Blockを使用した場合のサンプル・プログラム」で紹介したソース・コードに例外処理を追加し、try-catchステートメントのcatchブロック中でLoggingABを使用して例外情報をログ出力する場合のサンプル・プログラムである。

using Microsoft.Practices.EnterpriseLibrary.Data;
using Microsoft.Practices.EnterpriseLibrary.Data.Sql;
using Microsoft.Practices.EnterpriseLibrary.Logging;

public class CustomersTableDataGateway
{
  public DataSet GetCustomers()
  {
    try
    {
      Database database = DatabaseFactory.CreateDatabase();
      string query = "SELECT * FROM Customers";
      DBCommandWrapper wrapper = database.GetSqlStringCommandWrapper(query);
      return database.ExecuteDataSet(wrapper);
    }
    catch(SqlException ex)
    {
      LogEntry log = new LogEntry();
      log.Message = ex.Message;
      Logger.Write(log);
    }
  }
}
LoggingABを使用した場合のサンプル・プログラム(C#)
このサンプル・プログラムを実行するには、以下のアセンブリを参照設定に追加する必要がある。
・Microsoft.Practices.EnterpriseLibrary.Logging.dll

 上のサンプル・プログラムのログ出力機能を実行するために、わざと例外を発行させてみよう。具体的には、あらかじめ対象となるデータソース(ここではSQL Server)を停止しておいてから、上のサンプル・プログラムを実行する。この場合に出力されるログ内容は以下のようになる。

Timestamp: 2005/08/14 22:03:17
Message: SQL Server が存在しないか、アクセスが拒否されました。
Category: Trace
Priority: 0
EventId: 0
Severity: Unspecified
Title:
Machine: ICHIKAWA-YBF2Z6
Application Domain: EntLibSample.exe
Process Id: 5480
Process Name: D:\LoggingAB\DAAB\bin\Debug\EntLibSample.exe
Win32 Thread Id: 4116
Thread Name:
Extended Properties:
SqlException例外発生時にテキスト・ファイルへ出力されたログ内容

 「Flat File Sink」ノードのFileNameプロパティで出力先パスを指定しなかった場合は、デフォルトではLoggingABを利用するアプリケーションの実行フォルダ(サンプル・プログラムでは「D:\LoggingAB\DAAB\bin\Debug」)にログ・ファイル(ファイル名はデフォルトでは「trace.log」)が出力される。

●イベント・ログへ出力する

 出力先をテキスト・ファイルからイベント・ログへ切り替えたい場合は、Configurationコンソールで「Distributor Settings」ノードの「DefaultCategory」プロパティの設定値を「Trace」から「General」に変更するだけでよい。次の画面は、実際にイベント・ログに出力されたログ内容の例である。

SqlException例外発生時にイベント・ログへ出力されたログ内容

 ちなみに、何らかの原因で(ファイル・ロックなど)任意のリソースへのログ出力が失敗した場合は、その原因に関する情報とログの内容が自動的にイベント・ログへ出力されるようになっている。

カスタムSinkを作成する

 前掲の表「Enterprise Library 1.1のLoggingABで用意されているSink一覧」にもあるとおり、LoggingABはデフォルトでもさまざまなリソースへ出力するためのSinkを備えているのだが、ほかのリソースへ出力したいといった場合にユーザーが新たなSinkを独自に作成することで、そのリソース出力先を自由にカスタマイズできる機能も備えている。

 そこで次に、コンソール画面にログを出力するカスタムSinkである「Console Log Sink」を作成する手順を紹介する。

●ConsoleSinkクラス作成

 まずコンソール画面への出力処理を行うConsoleSinkクラスを実装する必要があるのだが、これには以下の手順に沿って、そのクラスを実装するだけでよい。

  1. Visual Studio .NETから新しくクラス・ライブラリ(プロジェクト名は「ConsoleSink」)を作成する

  2. 1で作成したプロジェクトに新しくクラス(クラス名は「ConsoleSink」)を追加し、LogSinkクラス(Microsoft.Practices.EnterpriseLibrary.Logging.Sinks名前空間)から継承させる

  3. ConfigurationViewクラス(LoggingABと構成情報を連結するクラス)のオブジェクトをパラメータに受け取る(LogSinkクラスの)Initializeメソッドをオーバーライドして、そこに初期化処理を実装する

  4. LogEntryクラス(ログ情報を保持するクラス)のオブジェクトをパラメータに受け取る(LogSinkクラスの)SendMessageCoreメソッドをオーバーライドして、そこに実際の出力処理を実装する

 上の手順を踏まえて作成されたConsoleSinkクラスのサンプルが以下である。

using Microsoft.Practices.EnterpriseLibrary.Configuration;
using Microsoft.Practices.EnterpriseLibrary.Logging;
using Microsoft.Practices.EnterpriseLibrary.Logging.Sinks;
using Microsoft.Practices.EnterpriseLibrary.Logging.Distributor.Configuration;

namespace EnterpriseLibrary.CustomSink
{
  public class ConsoleSink : LogSink
  {
    private LoggingConfigurationView configView;

    public override void Initialize(ConfigurationView configurationView)
    {
      this.configView = (LoggingConfigurationView)configurationView;
    }

    protected override void SendMessageCore(LogEntry logEntry)

    {
      CustomSinkData sinkData =
        (CustomSinkData)this.configView.GetSinkData(this.ConfigurationName);
      Console.WriteLine((string)sinkData.Attributes[“delimiter”]);
      Console.WriteLine(FormatEntry(logEntry));
    }
  }
}
コンソール画面にログを出力するカスタムSinkの実装例
このサンプル・プログラムをコンパイル・ビルドするには、以下のアセンブリを参照設定に追加する必要がある。
・Microsoft.Practices.EnterpriseLibrary.Configuration.dll
・Microsoft.Practices.EnterpriseLibrary.Logging.dll

 上のサンプル・プログラムをビルドして生成された(ConsoleSinkクラスを含む)アセンブリ(本稿の例では、ConsoleSink.dll)は、「LoggingABを利用するアプリケーションの実行フォルダ」の中に配置しておこう。このように事前に配置するのは、後述するConfigurationコンソールのTypeNameプロパティにConsoleSink.dllを登録するだけでは、実行フォルダにアセンブリがコピーがされないためである。

 次に、ConfigurationコンソールにConsoleSinkを登録しよう。


 INDEX
  連載:Enterprise Library概説
  拡張性と使いやすさを併せ持つログ出力機能を実装しよう
    1.ConfigurationコンソールでLoggingABの構成を設定する
  2.例外発生時のエラー情報を出力する
    3.カスタムSinkを作成する
 
インデックス・ページヘ  「Enterprise Library概説」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間