連載
» 2007年12月25日 00時00分 公開

連載:VBで実践! 外部コンポーネント活用術:オープンソースのロギング・サービス「log4net」を使う (2/4)

[岸本真二郎,デジタルアドバンテージ]

log4netの特徴

 ここまでの説明でlog4netの準備と簡単な使い方についてはご理解いただけたと思います。「app.configの記述がなんだか複雑そうだな」と思われたかもしれませんが、まさにそのとおりで、log4netではこのapp.configの記述がキモとなります。これを細かく調整することで、ログの出力を詳細にコントロールできます。

 ここであらためてlog4netの特徴をまとめておきます。その後、log4netの構成について詳しく紹介します。

■スレッドセーフ

 マルチスレッドの環境でも正しくログを生成することができます。

■ビルド後に構成(ログの出力先や出力するレベル)を変更できる

 app.configにログ生成の構成情報を記述するため、ビルド後でもapp.config(実際にはビルド後に「アプリケーション名.config」というファイル名となる)の内容を修正することで、ログの出力先や内容の変更ができます。

■動的な構成変更に対応

 log4netは、構成ファイル(これまでの例ではapp.config)を修正することでログ生成をコントロールできると説明しましたが、この修正はアプリケーション実行中であっても、修正内容が直ちにアプリケーションのログ生成処理に反映されます。

 上述のサンプル・アプリケーションでは、アセンブリ情報に記述した、

<Assembly: log4net.Config.XmlConfigurator(Watch:=True)>


の中の「Watch:=True」というパラメータがそれを指示しています。これは、log4netが構成ファイルの更新を監視し、構成ファイルの内容が更新された場合には構成情報を再度読み込んでログ出力のセッティングを変更するというものです。この機能はWindowsサービスやWebアプリケーションのように、ログ生成の構成変更の際にアプリケーションの実行を停止させることが難しいアプリケーションにとって有効です。

■出力先が豊富

 log4netの利点は何といっても、出力先の選択肢が豊富にあることです。ログを出力する媒体をlog4netでは「アペンダ(Appender)」と呼んでいますが、現時点では18個のアペンダが提供されています。

 この中にはイベント・ログに書き込みを行ったり、コンソールに表示したりするものが含まれていますが、Syslog経由でサーバに出力したり、TelnetやUDP経由でリモート・システムにログを送信するアペンダも用意されています。また、同時に複数の出力先を指定することも可能です。.NET アプリケーション作成の際に有効と思われるアペンダをいくつか挙げてみます。

アペンダのタイプ 機能
log4net.Appender.AdoNetAppender ADO.NETを使ってデータベースにログを書き込みます
log4net.Appender.ConsoleAppender コンソールにログを表示します
log4net.Appender.EventLogAppender イベント・ログにログを書き込みます
log4net.Appender.FileAppender ファイルにログを書き込みます
log4net.Appender.NetSendAppender WindowsのNetSendコマンドを利用して、ログをWindowsユーザーに送ります
log4net.Appender.RollingFileAppender ファイルの最大値を設定して、複数のログ・ファイルをサイクリックに作成します
log4net.Appender.SmtpAppender SMTPを使ってログをメールで送ります
log4net.Appender.TraceAppender 通常のトレースと同様にトレース情報としてログを生成します
表1 log4netで用意されている主なアペンダ

log4netの構成

 log4netの構成情報をapp.configにより記述する場合は、<configSections>要素の記述が必須となります。これはapp.configの構成セクションを記述するものなので、一度設定してしまえば修正する必要はありません。<configSections>要素に続いては、構成情報のメインとなる<log4net>要素を記述します。

 以下のapp.configを例にして<log4net>要素から順に解説していきます。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <!-- app.configに記述する場合に必要 -->
  <configSections>
    <section
      name="log4net" type=
      "log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
  </configSections>

  <log4net>
    <!-- ログ出力先の定義 -->
    <appender name="LogFileAppender"
              type="log4net.Appender.FileAppender" >

      <!-- 作成するログファイル -->
      <param name="File" value="C:\log-file.txt" />

      <!-- 追加 -->
      <param name="AppendToFile" value="true" />

      <!-- ログの書式 -->
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern"
               value="%d [%t] %-5p %c - %m%n" />
      </layout>
    </appender>

    <root>
      <!-- ログのレベルを指定 -->

      <!-- すべてのログ・レベルを出力 -->
      <level value="ALL" />

      <!-- どのログ出力先を使用するか -->
      <appender-ref ref="LogFileAppender" />
    </root>

  </log4net>

  <!-- (自動生成された部分は省略) -->

</configuration>

リスト5 app.configの記述例

■<log4net>要素

 log4netの構成情報を記述する最上位の要素です。ここに<appender>、<root>といった子要素を記述します。

 <appender>要素はログの出力先を定義するもので、構成情報の中では一番重要な部分です。ファイルに出力するのか、SQL Serverに記録するのか、メール送信を行うのかといった出力先の指定とそれぞれの出力先を定義するのに必要なパラメータを記述していきます。また、<root>要素はアペンダの選択やログのレベルなどのデフォルト設定を定義します。大規模なアプリケーションでなければ、<root>要素だけでも十分にログ出力をコントロールできると思われます。

■<appender>要素(アペンダ)

 取りあえずアペンダとは実際のログ出力を行うオブジェクトとして考えてください。そして<appender>要素で出力先の詳細を記述します。

 <appender>タグでは、name属性にアペンダの名前を指定し、type属性に表1に示したアペンダのタイプ(log4net.Appender.AdoNetAppenderやlog4net.Appender.FileAppenderなど)を指定します(アペンダのタイプについての詳細は後述)。<appender>要素にはさらに、type属性で指定したアペンダごとに固有の要素を記述します。例えば単純なファイル出力を行うFileAppenderであれば、ログ・ファイル名、ファイルを上書きするかどうか、追加書き込みを行うかどうかなどを指定します。

 <appender>要素は複数個記述できます。ログのレベルに応じて、ログ・レベルがERRORの際に使用するアペンダと、ログ・レベルがDEBUGの際に使用するアペンダをそれぞれ定義することでログ・ファイルを分けるといったことも可能です。

■<root>要素

 <root>要素では、<appender>要素に記述されたアペンダのうちどれを使用するかを指定します。これには<appender-ref>要素でアペンダの名前(name属性)を指定します。例えば「appender_A」「appender_B」という2つのアペンダを定義して、その両方にログを出力する場合は、次のように記述することで、両方のアペンダにログが出力されるようになります。

<appender-ref ref="appender_A" />
<appender-ref ref="appender_B" />

リスト6 複数のアペンダを指定する

 さらに<level>要素で、ログのレベルを指定します。ログ・レベルの順位は、次のようになっています。

ALL < DEBUG < INFO < WARN < ERROR < FATAL

 つまり、<level value="ALL"> と記述した場合は、すべてのログステートメントが実行されます。逆に<level value="FATAL">とした場合は、「log.Fatal(……)」で記述されたメッセージのみが記録されます。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。