連載
|
|
|
●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は、Configurationコンソールで設定された任意のしきい値を基にして、ログ・ファイルを自動的にバックアップするための拡張Sinkである。 Rolling Flat Sinkは、テキスト・ファイルへのログ出力に加えて、以下の機能も備えている。
なおログ・ファイルの書式がデフォルトの「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を使った例外ハンドリングについて、今回使用したサンプル・プログラムをベースに紹介していく予定である。
INDEX | ||
連載:Enterprise Library概説 | ||
拡張性と使いやすさを併せ持つログ出力機能を実装しよう | ||
1.ConfigurationコンソールでLoggingABの構成を設定する | ||
2.例外発生時のエラー情報を出力する | ||
3.カスタムSinkを作成する | ||
「Enterprise Library概説」 |
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|