【C#】【VS2010】Visual Studio 2010で Log4net を使う

Visual Studio 2010で Log4net を使う

 * VS2010で使用できないと思っていたが、ネットで解決方法を見つけたので、
   その方法を含めて、総合的にやり方を記録しておく

手順

log4net取得とVS2010の環境設定

 [1] log4netを以下のURLからダウンロード(この例では「log4net-1.2.10」)
http://logging.apache.org/log4net/download.html
 [2] ダウンロードしたファイルを解凍し、「log4net-1.2.10\bin\net\2.0\release\log4net.dll」を任意のパスにコピーする
 [3] VS2010のソリューションエクスプローラの[参照設定]を右クリックして
    [参照の追加]からコピーした「log4net.dll」を追加
 [4] 対象プロジェクトの右クリックし、「プロパティ」を選択
 [5] [アプリケーション]-[対象のフレームワーク]内の「.NET Framework 4 Client Profile」→「.NET Framework 4」に変更 

後日談

Log4NetのVer1.2.11からは
log4net-1.2.11\bin\net-cp\4.0\release
のDLLを使えば「.NET Framework 4 Client Profile」のままで大丈夫らしい。

AssemblyInfo.csの変更

* [Properties]-[AssemblyInfo.cs]を開き、以下を記述として加える
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
※ 「app.confing」以外のファイル名にしたい場合...
[assembly: log4net.Config.DOMConfigurator(ConfigFile = "../../log4net.xml", Watch = true)]
http://codezine.jp/article/detail/71?p=2

app.configの追加

 [1] 対象プロジェクトの右クリックし、[追加]-[新しい項目]-[アプリケーション構成ファイル]を選択し、
     ファイル名を「app.config」とする
 [2] 「app.config」を以下のようにして、保存する
 ※この設定が、唯一の欠点な気がする...以下URLで設定を勉強する必要がある
http://codezine.jp/article/detail/71?p=2
<?xml version="1.0" encoding="utf-8" ?>
<!-- [log4net.config] -->
<configuration>
  <configSections>
    <section name="log4net"
      type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  
  <appSettings>
    <!-- log4net 内部のデバッグメッセージを出力 -->
    <add key="log4net.Internal.Debug" value="true" />
  </appSettings>
  
  <log4net>
    <!-- コンソール出力用 (VS 上 [出力] ウインドウへの出力) -->
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
      <!-- 出力文字列のフォーマット -->
      <layout type="log4net.Layout.PatternLayout">
        <!--^「日付、スレッド、レベル、logger名、メッセージ」が出力^-->
        <!--^「%-5p」というのは5文字以下の場合、右側に空白を入れる設定^-->
        <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />

      </layout>
    </appender>
    
    <!-- ファイル出力用 -->
    <appender name="DailyFileAppender"
      type="log4net.Appender.RollingFileAppender">
      <!-- ログファイルの切替 { サイズ: Size, 日付: Date } -->
      <param name="RollingStyle" value="Date" />
      <!-- ファイル名 -->
      <param name="File" value="log/" />
      <!-- ファイル名に付加する日付パターン -->
      <param name="DatePattern" value='yyyyMMdd"_log.log"' />
      <!-- ファイル名の固定 -->
      <param name="StaticLogFileName" value="false" />
      <!-- ファイル書き込み { 追記: true, 上書き: false } -->
      <param name="AppendToFile" value="true" />
      <!-- 最大保存ファイル数 (古い順に削除) -->
      <param name="MaxSizeRollBackups" value="32" />
      <!-- 出力文字列のフォーマット -->
      <layout type="log4net.Layout.PatternLayout">
        <header type="log4net.Util.PatternString" value='[task time = "%date{HH:mm:ss,fff}"]%newline' />
        <footer type="log4net.Util.PatternString" value="[/task]%newline" />
        <conversionPattern value="%-5level %date{yyyy/MM/dd HH:mm:ss, fff} [%thread] %logger - %message%newline" />
      </layout>
      <!-- 出力するログ レベルのフィルタ -->
      <!-- Level : Fatal, Error, Warn, Info, Debug -->
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="Debug" />
        <levelMax value="Fatal" />
      </filter>
    </appender>
    
    <!-- イベント ログ出力用 -->
    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
      <!-- イベント ログ上のアプリケーション名 -->
      <applicationName value="AppName" />
      <!-- 出力文字列のフォーマット -->
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%-5level %date{yyyy/MM/dd_HH:mm:ss,fff} [%thread] %logger [%property{NDC}] - %message%newline" />
      </layout>
      <!-- 出力するログ レベルのフィルタ -->
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="ERROR" />
        <levelMax value="FATAL" />
      </filter>
    </appender>
    
    <!-- デフォルトの出力設定 -->
    <root>
      <level value="ALL" />
      <appender-ref ref="ConsoleAppender" />
      <appender-ref ref="DailyFileAppender" />
      <appender-ref ref="EventLogAppender" />
    </root>
  </log4net>
</configuration>

呼び出し部分の実装

[1] ログを出力したい対象クラスに以下を追記
    private static readonly log4net.ILog logger
        = log4net.LogManager.GetLogger(
        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
[2] 必要な部分に、ログのレベルに注意しながら、実装する
// ログを出力したい箇所に以下のようにする...
logger.Fatal("Fatal(致命的障害):システム停止するような致命的な障害");
logger.Error("Error(障害):システム停止はしないが、問題となる障害");
logger.Warn("Warn(警告):障害ではない注意警告");
logger.Info("Info(情報):操作ログなどの情報");
logger.Debug("Degug(デバッグ・トレース用):開発用のデバッグメッセージ");