(1/4).NET用定番コンポーネントを紹介する新連載。構成ファイルの修正だけでカスタマイズ可能な「log4net」を解説。Serviceプロジェクトのlog4netアプリケーションの開発では、コーディングが完了して動作確認をしたらきっぱり開発者の手を離れる......などということはほとんどないでしょう。コンシューマ向けのパッケージ作成であれば入念な動作テストが行われた後にリリースということになるでしょうが、特に社内で使用するアプリケーションの作成では、配布後にいろいろな修正要求や「うまく動かないんだけど......」といったリクエストを受け取ることが多々あります。ユーザーからの「うまく動かない」という報告があった場合、「動かない」状況をきちんと(開発者が納得できるような)説明をしてもらえることは(まずほとんど)期待できません。そのためアプリケーションにログ機能を持たせ、ログ・ファイルに実行状態を書き込んだり、エラー発生時にはイベント・ログを出力するなどして問題が発生した場合の原因特定の手掛かりを残しておくことは不可欠ともいえます。Projectの「log4net」というログ作成ツールを紹介します。Framework用のlog4net以外にも、C++用のlog4cxx、PHP用のlog4phpなども提供されています。log4netの特徴はなんといってもログの出力先の構成の柔軟さにあります。Serverにログを書き込むことや、ログをメール送信することも可能です。構成の変更はビルド後でも行えるので、ログ出力の構成を変更するのにコードを修正したり、再ビルドしたりする必要はありません。log4netを使ったサンプルを作ってみるまずはlog4netを使った簡単なサンプルを紹介しましょう。log4net」のページからソース・コードとバイナリが含まれたZIPファイルをダウンロードできます(本稿執筆時点の最新バージョンは1.2.10で、ダウンロードできるファイルは「incubating-log4net-1.2.10.zip」)。2005でlog4netを利用する場合は、bin\net\2.0にあるlog4net.dllを使用します。1.1を使用する場合は、bin\net\1.1に含まれるlog4net.dllを使用します。ZIPファイルを展開するフォルダはどこでも構いません。2005でプロジェクトを作成ここでは、一番シンプルなWindows用のアプリケーションであるコンソール・アプリケーションを作成します。2005からプロジェクトの新規作成でコンソール・アプリケーションのテンプレートを選択して、プロジェクトを作成します。■参照の追加プロジェクトが作成できたら、プロジェクトからlog4netが利用できるように「参照の追加」を行います。これには、ソリューション・エクスプローラに表示されているプロジェクトを右クリックして表示されるメニューから[参照の追加]を選択し、先ほどのlog4net.dllを追加します。ソリューション・エクスプローラのツールバーから[すべてのファイルを表示]ボタンをクリックしておくとプロジェクトのツリーの中に「参照設定」という項目が表示されますので、そこから[参照の追加]を行ってもよいでしょう。■アプリケーション構成ファイル「app.config」の追加log4netの構成を記述するためにアプリケーション構成ファイルである「app.config」を用意します。これもソリューション・エクスプローラでプロジェクトを右クリックして[追加]−[新しい項目]を選択してから、テンプレートとして「アプリケーション構成ファイル」を選択します。ファイル名はapp.configのままで大丈夫です。次にlog4netのアセンブリ情報を追加します。これはlog4netの初期値を指定するもので、構成ファイルの名前や、構成情報が修正された際に構成情報を再ロードするように構成情報の監視(Watch:=True)を指定します。ここでは、構成ファイルはデフォルトのまま(app.config)ですので、構成情報のファイル名の指定は行っていません(ASP.NETの場合については後述します)。Project」の項目を展開して、コード・エディタでAssemblyInfo.vbを開きます*1。AssemblyInfo.vbの最後に次の1行を追加します。Project」が表示されていない場合は、ソリューション・エクスプローラのツールバーの「すべてのファイルを表示」をオンにしてください。続いては、どんな媒体にログを出力するかというlog4netの構成を決めます。この構成は、先ほど作成したapp.configに記述していきます。app.configにすでに記述されている内容はそのままにして、リスト1に示すように<configuration>要素の中に<configSection>要素と<log4net>要素を追加します。ここでは最低限のログ出力ということで、ファイルにログを出力するように設定しています。リスト1では、「C:\log-file.txt」に追加でログを書き込む指定を行っています(内容についての解説は後述)。以上でログを作成する準備ができました。最後にソース・コードにログを記録するコードを記述していきます。ログ出力を行うオブジェクト(インスタンス)を取得する必要があります。_System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)というコードをModule内の先頭に記述しておきます。このコードはlog4net利用時の定型的なものなので、オマジナイだと思ってコピー&ペーストしておけばよいでしょう。これによりlogという名前のオブジェクトを使ってログの出力が行えるようになります。_System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)と記述しておき、クラス内のメソッドでlogオブジェクトのメソッドを呼び出せるようにしておきます。log4netでログを出力するプログラムは、例えば次のリスト2のようになります。ログ出力のコード例という具合に、logオブジェクトのメソッド(Fatal、Error、Info、Debug、Warnなど)を呼び出します。このとき引数として指定できるのは、文字列もしくは例外オブジェクトです。FATAL)、それぞれに対応したログ出力のメソッドが用意されています。後述しますが、どのレベルのログを出力するかを構成ファイルで指定することで、ログの出力内容をコントロールできます。デバッグ時はすべてのログを出力し、リリース後はログのレベルがERROR以上だけを出力する(log.Errorメソッドとlog.Fatalメソッドのみを有効にする)といったことが可能です。■ビルドビルドの際に特別な作業はありません。参照設定に追加したlog4net.dllがビルド後にbin\Debug(リリース・ビルドではbin\Release)にコピーされていることが確認できれば問題ありません。log4net.dllがDebugフォルダにコピーされていない場合は、log4netの参照プロパティの「ローカルコピー」がTrueになっているかを確認してみてください。「log4netのスキーマ情報が見つかりませんでした」というエラー・メッセージが表示される場合がありますが、この場合は、まずソース・ファイルにコンパイル・エラーがないかを確認してみてください。以上の作業でlog4netによるログ出力を行うサンプル・プログラムが実行できるようになりました。実際に実行してみると、次のリスト4のような内容のログ・ファイル「C:\log-file.txt」が作成されます。出力されたログには、ソース・コード上で引数として指定した文字列に加えて、日付やクラス名なども含まれているのが分かります。このログの書式については後述しますが、ユーザー名、ファイル名などをログに含めることも可能です。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。