連載
Enterprise Library概説

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

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

●ConfigurationコンソールにConsoleSinkを登録する

 Configurationコンソールの[Distributor Settings]ノード配下の[Sinks]ノードを右クリックしてコンテキスト・メニューを表示し、そこから[New]−[Custom Sink]を選択し、「Custom Sink」ノードの各プロパティを以下の表のとおりに設定する。

プロパティ 設定値
Attributes (コレクション)
Name Console Sink
TypeName EnterpriseLibrary.CustomSink.ConsoleSink, ConsoleSink, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
「Custom Sink」ノードのプロパティに対する設定値(本稿での例)
TypeNameプロパティには先ほど作成したConsoleSink.dllを設定する。Attributesプロパティではキー名(Name)に対応する属性値(Value)を設定することができる。これによって、例えば後で紹介する本稿のサンプル・プログラムでは、「Console.WriteLine((string)sinkData.Attributes[“delimiter”]);」の行で(つまり、ログ情報の前で)、キー名「delimiter」に対応する属性値「区切り線(-----)」を表示しているが(本稿の例では「delimiter」キーに対応する属性値として「区切り線(-----)」を設定している)、ここに別の文字列を表示したい場合はConfigurationコンソールでその属性値を変更すればよい。

 これでConsoleSinkクラスを使うための準備が整ったので、先ほど示した「LoggingABを使用した場合のサンプル・プログラム」を実行してみよう。するとコンソール画面が表示され、ログの内容が表示されるのが確認できるだろう。

ConsoleSinkクラスを使ってコンソール画面にログ出力を行った結果
Windowsアプリケーションでコンソール画面を表示するには、Visual Studio .NETのIDEのメニューバーから[プロジェクト]−[プロパティ]−[全般]−[出力の種類]を選択して、コンソール・アプリケーションを選択する必要がある。なおこのサンプル・プログラムを実行するには、「Custom Sink」ノードのTypeNameプロパティに設定したアセンブリが、実際に「LoggingABを利用するアプリケーションの実行フォルダ」に配置されている必要がある。このアセンブリは、ConfigurationコンソールにConsoleSinkクラスを登録するだけではコピーされないので注意が必要である。

 カスタム動作を作成できるのは、何もSinkだけの機能ではなく、Formatterについても同様のカスタムFormatterを作成することができる。

 LoggingABは、デフォルトではテキスト形式のText Formatterしか備えていないが、もしXML形式などほかの書式で出力したい場合には、カスタムSinkと同じ要領で、カスタムFormatterを作成可能である。ちなみにこういったカスタムSinkやカスタムFormatterの作成手順については、「Enterprise Library 1.0 Hands On Labs」で詳細に解説されているため、参考にするとよいだろう。

【Enterprise Library Tips】
Rolling Flat Sink

 Rolling Flat Sinkは、Configurationコンソールで設定された任意のしきい値を基にして、ログ・ファイルを自動的にバックアップするための拡張Sinkである。

 Rolling Flat Sinkは、テキスト・ファイルへのログ出力に加えて、以下の機能も備えている。

  • ログ・ファイルが任意のサイズ(単位はKbytes、Mbytes、Gbytes)を超えた場合に、自動的にバックアップを取る機能
  • ログ・ファイルが任意の相対時間(単位はMonths、Weeks、Days、Hours、Minutes)を経過した場合に、自動的にバックアップを取る機能
  • ログ・ファイルの日付書式を任意に設定できる(デフォルトは「yyyy-MM-dd [hh-mm t]」)

 なおログ・ファイルの書式がデフォルトの「yyyy-MM-dd [hh-mm t]」のままでは、実際には「2005-8-27 [13-15 ]」と表示されてしまう(文字が一部しか表示されない)。これを回避するには、「yyyy-MM-dd [hh-mm tt]」とすればよい。これにより、「2005-8-27 [13-15 午]」と正しく表示される。

 Rolling Flat Sinkの詳細については、patterns & practices Enterprise Library(日本語情報サイト)の「Rolling File Sink 利用手順」を参考にしてほしい

ベスト・プラクティスを追求したLoggingAB

 Enterprise Library 1.0版がリリースされて間もないころに、アメリカでは、「LoggingABはlog4netの100倍以上遅い」という議論が起こったことがある。

 log4net(「ログ・フォー・ネット(Log For NET)」と読む)とは、Webサーバ「Apache」のサプ・プロジェクトとして開発されたJava用ロギング・ツール「log4j」を、.NET用に移植したものだ(log4netは公式サイトから入手可能)。

 この議論の根拠になったパフォーマンス解析ツール「LoggingProfile」(現在このツールは、「Loren Halvorson's Blog:Microsoft Enterprise Library Logging Block compared to Log4net」の「You can download the Visual Studio 2003 test solution from here」と記述さている場所からダウンロード可能)を使って、筆者も両ロギング・ツールのパフォーマンスを検証してみた。その結果を以下の表に示す。

LoggingAB
(EntLib 1.0)
LoggingAB
(EntLib 1.1)
log4net
起動時間 5204ms 3031ms 156ms
1万回ログ出力時の時間 17391ms 10375ms 1ms以下
LoggingABとlog4netのパフォーマンス比較
EntLib 1.0は「Enterprise Library 1.0」の略で、EntLib 1.1は「Enterprise Library 1.1(Enterprise Library - June 2005)」の略である。単位は、ミリ秒(ms)で、1msは1000分の1秒を表す。検証に使ったPCのスペックは、CPUがCeleron 2.2GHz、メモリが768Mbytesである。

 確かにこの表だけを見ればLoggingAB(EntLib 1.0)は、log4netの100倍以上遅いといえるかもしれない。しかし実際の業務において一度に1万回も続けてログ出力を行うケースが果たしてあるのだろうか? たった1回のログ出力であれば、それにかかるLoggingAB(EntLib 1.0)の時間はわずか1.7ms(1.7/1000秒)にすぎない。このパフォーマンスが実際の業務で問題になることはほとんどないだろう。

 そもそもLoggingABに限らず、Enterprise Libraryそのもの(の根本となる設計思想)が、ベスト・パフォーマンスを追求することよりも、patterns & practicesが示しているベスト・プラクティスを追求することに重きが置かれている。LoggingABがlog4netと比べて遅いのは、Configurationコンソールで設定された構成情報をデシリアライズしたり、パフォーマンス・カウンタやWMI(Windows Management Instrumentation)からさまざまな情報を収集したりしているからであり、ある程度の負荷はやむを得ないことである。

 それでもどうしてもLoggingABのパフォーマンスが気になるのであれば、ユーザー自身が直接ソース・コードを修正するのもよいだろう。本連載の最初で述べたように、Enterprise Libraryはそのようなユーザーによるカスタマイズが可能なオープン・ソースのライブラリである。

 以上、今回はLoggingABの概要説明と導入手順、さらにはカスタムSinkを作成する手順について解説した。次回はException Handling Application Blockを使った例外ハンドリングについて、今回使用したサンプル・プログラムをベースに紹介していく予定である。End of Article


 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 記事ランキング

本日 月間