中堅プログラマーの備忘録

忘れっぽくなってきたので備忘録として・・・

【c#.net】log4netを使ってログの設定を行う

開発環境:visual studio2015
開発言語:c#.net

1.概要

ログデータの管理はアプリケーションにおいて非常に重要な要素となります。
ここの設計を間違えてしまうと、要因解析に無駄な時間を費やすことになります。
今回は【log4net】を使ってみます。

2.【lNuGet】から【log4net】を取得する

【ツール】→【NuGetパッケージマネージャー】→【ソリューションのNuGetパッケージの管理】をクリック。
【参照】をクリックし、検索ボックスに【log4net】と入力する。
検索結果から【log4net】を選択し【インストール】をクリック。
 
f:id:tsu--kun:20190619204724p:plain

インストールが完了すると【ソリューションエクスプローラー】の参照にlog4netが追加されています。

3.【AssemblyInfo.cs】に【log4net】の設定ファイルの場所を教える

【ソリューションエクスプローラー】の【Properties】にある【AssemblyInfo.cs】を開く。
開いたファイルに下記の記述を追加する。

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

f:id:tsu--kun:20190619204900p:plain

4.【log4net】の設定

プロジェクトに【log4net.config.xml】を追加します。
【ソリューションエクスプローラー】のプロジェクト名を右クリックし
【追加】→【新しい項目】をクリックし、XMLファイルを作成する。

f:id:tsu--kun:20190619204920p:plain

作成した【log4net.config.xml】の【プロパティ】の詳細から
【出力ディレクトリにコピー】の項目を【コピーしない】から【常にコピーする】に変更。


【log4net.config.xml】の内容は下記のとおりとしました。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <log4net>
  
    <appender name="DailyAppender" type="log4net.Appender.RollingFileAppender" >
      <File value="C:\ProgramData\testApplication\log\" />
      <DatePattern value='yyyyMMdd".log"' />
      <StaticLogFileName value="false" />
      <RollingStyle value="date" />
      <AppendToFile value="true" />
      <MaximumFileSize value="10MB" />
      <MaxSizeRollBackups value="30" />
      <layout type="log4net.Layout.PatternLayout">
        <ConversionPattern value="%date [%thread] [%-5level] (%method) - %message%n" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <LevelMax value="FATAL" />
        <LevelMin value="DEBUG" />
      </filter>
    </appender>
    
    <root>
      <level value="ALL" />
      <appender-ref ref="DailyAppender" />
    </root>
    
  </log4net>
</configuration>

①【appender】

・【type】
 →【log4net.Appender.RollingFileAppender】に設定することで
  ファイルの最大値を設定して、複数のログ・ファイルをサイクリックに作成します。

・【File】
 →ファイルの出力先を設定します。

・【DatePattern】
 →ファイル名に付加する日付パターンを指定します。

・【StaticLogFileName】
 →ファイル名の固定。今回は固定しないを選択しています。

・【RollingStyle】
 →日付によってログファイルを切り替えます。

・【AppendToFile】
 →ログファイルへ追記します。falseにすると上書きとなります。

・【MaximumFileSize】
 →10Mを超えると新しいログファイルを作成します。RollingStyleがsizeの時に有効になります。

・【MaxSizeRollBackups】
 →保存ファイルの最大値です。

・【layout】
 →ログに吐き出す内容を設定します。
  【date】:ログの出力時刻です。
  【thread】:スレッドの名前を出力します。名前がない場合はスレッド番号になります。
  【level】:イベントのレベルを出力します。
  【method】:メソッド名を出力します。
  【message】:アプリで設定したメッセージが出力されます。

・【filter】
 →【log4net.Filter.LevelRangeFilter】に設定することで
  ログレベルの範囲でフィルタリングします。
  ログレベルは【DEBUG】<【INFO】<【WARN】<【ERROR】<【FATAL】
  の5種類で今回は全てのログを有効にしています。

②【root】

・【level】
 →出力ログレベル

・【appender-ref】
 →使用するappender名

5.実装する

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using log4net;

namespace log4netTest
{
    public partial class Form1 : Form
    {
        private static readonly log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            logger.Debug("デバッグ");
            logger.Info("情報");
            logger.Warn("注意");
            logger.Error("障害");
            logger.Fatal("致命的障害");
        }
    }
}

  
実行すると
【C:\ProgramData\testApplication\log\20190619.log】
が作成され、ファイルの中身は

2019-06-19 18:35:28,533 [10] [DEBUG] (Form1_Load) - デバッグ
2019-06-19 18:35:28,554 [10] [INFO ] (Form1_Load) - 情報
2019-06-19 18:35:28,555 [10] [WARN ] (Form1_Load) - 注意
2019-06-19 18:35:28,556 [10] [ERROR] (Form1_Load) - 障害
2019-06-19 18:35:28,556 [10] [FATAL] (Form1_Load) - 致命的障害

のように出力されます。