Unityが、いい感じのDIコンテナっぽい。
ということで、ほかのApplication Blockもぼちぼちいじってみようと思う。どれから使おうか悩んだけど、一番手軽に使えそうなものとして、Logging Application Blockを選んでみた。
EntLib4.0のLoggingの情報をWebで探してみたけど、簡単に探した範囲内だと、見つけきらなかったので泣く泣く英語のドキュメントを見ながられっつトライ!!
とりあえず、お試しのためにConsole Applicationのプロジェクトを1つ追加する。名前はLoggingTestにした。ここに、色々追加していってファイルにログを出力するようにしてみようと思う。
参照の追加
- Enterprise Library Application Block
- Enterprise Library Shared Library
- Microsoft.Practices.ObjectBuilder2
この3つを参照に追加する。
App.configの編集
App.configにLogging Application Blockの設定を追加する。
log4netしかりs2.netしかり、こういうのは一番メンドクサイところでもある。俺様フレームワークでも、きっとApp.configにごにょごにょして…という感じに作ってしまいそう(というか、それが正当だしね)だ。しかし、EnterpriseLibraryでは、専用の編集ツールがついてきているので、めんどくささはあまり感じない。
GUIでの編集万歳!ということでぽちぽちします。
- 新規作成でアプリケーション構成ファイル(App.config)を追加する。
- ソリューションエクスプローラで、App.configの右クリックメニューからEdit Enterprise Library Configurationを選ぶ
- Logging Application Blockを追加する
- Trace ListenersにFlat File Trace Listenerを追加する
- FlatFile TraceListenerのプロパティを編集する。
保存するファイル名は、デフォルトでtrace.logになっているので、そのまま利用する。
Formatterプロパティには、Logging Application Blockを追加したときに作られているText Formatterを指定する。
- Special SourcesのAll EventsにTraceListener Referenceを追加する。
- TraceListener ReferenceのReferencedTraceListenerに、4で作ったFlatFile TraceListenerを設定する。
- 保存してApp.configを閉じる
これで、Logging Application BlockのAPIを使ってログを出力すると問答無用でtrace.logに出力されるようになるはず。
個人的な理解としては
- ~Listenerでどこに出力するか決める
- ~Formatterで、どういう書式で出力するか決める
- ~Sourcesで、どういう時に、どのListenerを使うか決める
- ~Filter(今回はつかってない)で、出力するログをフィルタリングする
くらいだと思ってる。TOEIC285点の英語力でなんとなく思ったことなので間違ってる可能性が非常に高いので、間違ってたら誰か指摘していただきたい。
APIを使ってログを出力する
ついに楽しいプログラミング!!
Program.csにHello worldというログを出力するプログラムを書いていく。といってもとっても簡単。説明をする前にプログラムをさくっと乗せてみる。
using Microsoft.Practices.EnterpriseLibrary.Logging;
namespace LoggingTest
{
class Program
{
static void Main(string[] args)
{
// メッセージがHello worldのログエントリ
var logEntry = new LogEntry
{
Message = "Hello world"
};
// ログエントリを出力
Logger.Write(logEntry);
}
}
}
これを実行すると、exeと同じフォルダにtrace.logというファイルが出来上がる。内容は下のような感じ。
----------------------------------------
Timestamp: 2008/07/20 2:15:16
Message: Hello world
Category: General
Priority: -1
EventId: 0
Severity: Information
Title:
Machine: KAZUKI-PC2
Application Domain: LoggingTest.exe
Process Id: 5748
Process Name: C:\Users\Kazuki\Documents\Visual Studio 2008\Projects\LoggingTest\LoggingTest\bin\Debug\LoggingTest.exe
Win32 Thread Id: 1144
Thread Name:
Extended Properties:
----------------------------------------
Messageに、プログラムから指定したHello worldの文字列があるのがわかる。ここに列挙されているProirityやEventIdなんかも、LogEntryのプロパティとして用意されているので、プログラム上から指定すれば任意の値を設定することが出来るようになってる。
例えば、Titleを指定してログを出力する場合は下のようになる。
var logEntry = new LogEntry
{
Title = "たいとる",
Message = "Hello world"
};
このLogEntryを出力すると、下のようなログがファイルに保存される。
----------------------------------------
Timestamp: 2008/07/20 2:28:20
Message: Hello world
Category: General
Priority: -1
EventId: 0
Severity: Information
Title:たいとる
Machine: KAZUKI-PC2
Application Domain: LoggingTest.exe
Process Id: 4872
Process Name: C:\Users\Kazuki\Documents\Visual Studio 2008\Projects\LoggingTest\LoggingTest\bin\Debug\LoggingTest.exe
Win32 Thread Id: 4756
Thread Name:
Extended Properties:
----------------------------------------