9.log4net (ログ出力ライブラリ)

ログ出力ライブラリ(log4net)について説明していきます。

アグリモの製品では、ひかりFAX電話CTIで使用しています。log4net 以外に Nlog もありますが、アグリモでは log4net の方を採用しています。理由は、Apache が製作している点とあとは長年の実績を評価しました。

 

1.新規にソリューションを作成します。

2.パッケージマネージャーコンソールで、「Install-Package log4net」と入力してEnterキーを押下します。

3.プロジェクトの参照にDLLが追加されます。

4.Properties の中にある AssemblyInfo.cs を開いて、以下の行を追加します。

// log4net configuration file
[assembly: log4net.Config.XmlConfigurator(ConfigFile = @"log4net.config", Watch = true)]

5.プロジェクトに log4net.config を追加します。

log4net.config のプロパティを開いて、「ビルドアクション」を「コンテンツ」に、「出力ディレクトリにコピー」を「常にコピーする」に変更します。

 

以下は log4net.config のサンプルです。(ひかりFAX電話CTIのものです。)

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

    <!-- 通常ログ:単一ファイル出力 -->
    <appender name="InfoLogDailyAppender" type="log4net.Appender.FileAppender">
      <File value="${APPDATA}\\AGRIMO.JP\\ひかりFAX電話CTI\\Logs\\Info.log" />

      <AppendToFile value="true" />

      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMax" value="WARN" />
        <param name="LevelMin" value="INFO" />
      </filter>

      <layout type="log4net.Layout.PatternLayout">
        <ConversionPattern value="%date [%thread] [%-5level] %logger - %message%n" />
      </layout>
    </appender>

    <!-- エラーログ:分割ファイル出力 -->
    <appender name="ErrorLogDailyAppender" type="log4net.Appender.RollingFileAppender">
      <!-- ファイル名は日付ごと -->
      <param name="File" value="${APPDATA}\\AGRIMO.JP\\ひかりFAX電話CTI\\Logs\\Error_" />
      <param name="DatePattern" value='yyyyMMdd".log"' />
      <param name="RollingStyle" value="date" />
      <param name="StaticLogFileName" value="false" />

      <param name="AppendToFile" value="true" />

      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMax" value="FATAL" />
        <param name="LevelMin" value="ERROR" />
      </filter>

      <param name="MaximumFileSize" value="10MB" />
      <param name="MaxSizeRollBackups" value="10" />

      <layout type="log4net.Layout.PatternLayout">
        <ConversionPattern value="%date [%thread] [%-5level] %logger %file(%line) %class %method - %message%n" />
      </layout>
    </appender>

    <!-- デバッグ用:分割ファイル出力 -->
    <appender name="DebugLogDailyAppender" type="log4net.Appender.RollingFileAppender">

      <!-- ファイル名は日付ごと -->
      <param name="File" value="${APPDATA}\\AGRIMO.JP\\ひかりFAX電話CTI\\Logs\\Trace_" />
      <param name="DatePattern" value='yyyyMMdd".log"' />
      <param name="RollingStyle" value="date" />
      <param name="StaticLogFileName" value="false" />

      <param name="AppendToFile" value="true" />

      <filter type="log4net.Filter.LevelRangeFilter">
        <!-- <param name="LevelMax" value="FATAL" /> -->
        <param name="LevelMin" value="TRACE" />
      </filter>

      <param name="MaximumFileSize" value="10MB" />
      <param name="MaxSizeRollBackups" value="10" />

      <layout type="log4net.Layout.PatternLayout">
        <ConversionPattern value="%date [%thread] [%-5level] %logger %file(%line) %class %method - %message%n" />
      </layout>
    </appender>

    <root>
      <!-- TRACE以上のログを記録 -->
      <level value="TRACE" />
      <!-- 使用する Appender -->
      <appender-ref ref="InfoLogDailyAppender" />
      <appender-ref ref="ErrorLogDailyAppender" />
      <appender-ref ref="DebugLogDailyAppender" />
    </root>

  </log4net>
</configuration>

 

利用方法は色々あると思いますが、以下にサンプルソースを示します。

以下の Logs_MessageBox.cs は、メッセージボックスの表示と同時にログ出力も行います。

using log4net;
using System.Windows.Forms;

namespace Hikari_FAX_Denwa_CTI_Client
{
    class Logs_MessageBox
    {
        public static DialogResult Show(string text, string caption, MessageBoxButtons mbutton, MessageBoxIcon mbicon)
        {
            ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

            if (mbicon == MessageBoxIcon.Asterisk || mbicon == MessageBoxIcon.Information)
            {
                logger.Info(text.Replace("\r", "").Replace("\n", ""));
            }
            else if (mbicon == MessageBoxIcon.Error || mbicon == MessageBoxIcon.Hand || mbicon == MessageBoxIcon.Stop)
            {
                logger.Error(text.Replace("\r", "").Replace("\n", ""));
            }
            else if (mbicon == MessageBoxIcon.Warning || mbicon == MessageBoxIcon.Exclamation)
            {
                logger.Warn(text.Replace("\r", "").Replace("\n", ""));
            }
            else
            {
                logger.Debug(text.Replace("\r", "").Replace("\n", ""));
            }

            return MessageBox.Show(text, caption, mbutton, mbicon);
        }
    }
}