log4net でログレベル毎に出力先を指定する

現在のプロジェクトでは、log4net を使用してログを出力することになっていた。
ログファイル名は日付によって変わるが、その日のすべてのログが1つのファイルに出力される。


ある時、ログレベル毎に出力先のファイルを変更できれば便利じゃないか?と指摘された。
確かに、と思っていろいろ調べてみたが、どうも見つけられない。


それならば、と本家のサイトを見てみたらあっさり見つかった。
キーになるのは log4net.Filter.LevelRangeFilter というフィルタクラス。
こいつに出力したいログレベルの範囲を指定して、ログレベル毎にアペンダを設定してやればいい。

DEBUG・INFO・ERROR で出力ファイルを分けてみる。

ここにWindowsアプリのソースを置いておく。
このアプリでは、Form上のボタンを押すとログレベル別にログが出力される。

アプリケーション構成ファイルはこんな感じ。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
  </configSections>
  <log4net>
    <appender name="DebugAppender" type="log4net.Appender.FileAppender">
      <param name="File" value="C:\log\Debug.log" />
      <param name="AppendToFile" value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="DEBUG" />
        <levelMax value="DEBUG" />
      </filter>
    </appender>
    <appender name="InfoAppender" type="log4net.Appender.FileAppender">
      <param name="File" value="C:\log\Info.log" />
      <param name="AppendToFile" value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="INFO" />
        <levelMax value="INFO" />
      </filter>
    </appender>
    <appender name="ErrorAppender" type="log4net.Appender.FileAppender">
      <param name="File" value="C:\log\Error.log" />
      <param name="AppendToFile" value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="ERROR" />
        <levelMax value="ERROR" />
      </filter>
    </appender>

    <root>
      <level value="DEBUG" />
      <appender-ref ref="DebugAppender" />
      <appender-ref ref="InfoAppender" />
      <appender-ref ref="ErrorAppender" />
    </root>
  </log4net>
</configuration>