C#によるlog4netの実装
アプリケーションにログ機能を持たせ、ログ・ファイルに実行状態を書き込んだり、エラー発生時にはイベント・ログを出力します。log4netは.net用に作成されたログ作成ツールで、ログレベル、ログ出力の形式など、パラメータにより様々な設定ができます。
log4netのインストール(2018/03/25追加)
log4netはNugetを使って、Packageをインストールします。プロジェクトを右クリックし、「NuGetパッケージの管理」を選択し、オンラインで「log4net」を検索して、インストールボタンを押すと、当該プロジェクトにインストールされます。画面表示を次に示します。
log4netのフォルダがプロジェクトに作成され、「packages.config」がソリューションエクスプローラに表示されます。packages.configを開いてtargetFrameworkで示されるフォルダの「log4net.dll」「log4net.xml」がビルド時に使用されます。
ログ出力形式の設定
ログ出力形式を記述する場合、独自にファイルを定義したい場合があると思います。そこで、今回はログ出力形式の設定を「app.confing」以外、log4net.xmlとした場合の設定方法を示します。
「app.confing」以外のファイル名にしたい場合は、[Properties]-[AssemblyInfo.cs]を開き、 AssemblyInfo.csの最終行に次のデータを記述します。この設定では、ログ出力形式の設定ファイルは、実行ファイルの置かれたディレクトリに置かれ、ファイル名は「log4net.xml」としています。
[assembly: log4net.Config.DOMConfigurator(ConfigFile = “log4net.xml”, Watch = true)]
「log4net.Config.DOMConfigurator」は「古い形式です」の警告が出ます。「log4net.Config.XmlConfigurator」に変更します。
2023/11/12 ・「古い形式です」の警告により以下の通り修正
[assembly: log4net.Config.XmlConfigurator(Watch = true, ConfigFile = “log4net.xml”)]
log4net.xmlの構成
log4net.xmlには次の要素が使用されます。
<appender>要素は、ログの出力先を定義するもので、構成情報の中では一番重要な部分です。ファイルに出力するのか、SQL Serverに記録するのか、メール送信を行うのかといった出力先の指定とそれぞれの出力先を定義するのに必要なパラメータを記述していきます。
例えば、単純なファイル出力を行うFileAppenderであれば、ログ・ファイル名、ファイルを上書き/追加書き込みの指示、<filter>要素にはログレベル、<conversionPattern>要素にはログの書式が指定できます。
<filter>要素では、”デフォルトではフィルタがかかっていない為、(Threshold 等で指示されない限り) logger のレベル指定に従ってログが出力されます。これを「指示したレベルだけ出力する」ようにするためには、出力させたいログを選別するフィルタと、DenyAllFilter を組み合わせる必要があります。
特定のレベルのみ出力させるためには、LevelMatchFilter を使います。このフィルタと DenyAllFilter を appender 要素内の layout よりも後に記述します。
ログレベルの指定
LevelMatchFilter
特定のログレベルでフィルタリングする場合
LevelRangeFilter
ログレベルの範囲でフィルタリングする場合
StringMatchFilter
ログメッセージでフィルタリングする場合
DenyAllFilter
指示された以外のすべてのログを無効にする場合。通常上記のフィルタと共に使用する。
<conversionPattern>要素で指定できる変換パターンの一覧表を次に示します。
ログ出力時の変換パターン一覧
%newline
%logger
ロガー名(例:List)
%class
実行中のクラス名(例:java.net)
%date
現在の日付($d{yyyy年MM月dd日})(例:toString())
%file
ファイルのパス
%location
メソッド名とファイル名および行番号(例:Calendar.isTime)
%line
%message
メッセージ
%method
メソッド名
%timestamp
アプリケーションの経過時間
<root>要素では、<appender>要素に記述されたアペンダのうちどれを使用するかを指定します。ここでアペンダを定義すると、定義されたアペンダに従って、ログが出力されるようになります。
<!-- Debug以上のログを記録 -->
<level value="Debug" />
<!-- 使用する Appender -->
<appender-ref ref="InfoLogDailyAppender" />
<appender-ref ref="ErrorLogDailyAppender" />
<appender-ref ref="DebugLogDailyAppender" />
</root>
世代管理を行うMaxSizeRollBackupsは、ローテートして残しておくログファイル数、つまり世代管理数を示します。
0 : バックアップを行わずに、最新のログファイルのみ存在する状態になります。デフォルト値。
0未満 : 上限無しで、ひたすらファイルが増えます。
1以上 : 管理する世代数を示します
log4net.xml
上記で説明した要素に従い構成したlog4net.xmlを次に示します。このファイルの設定では、ログファイルの先頭部分は、「Trace_」、日付部分は「yyyyMMdd」、ファイルが置かれるディレクトリは「log」で、追加書き込みとなります。また、すべてのログレベルを対象とし、最大ファイルサイズが10Mbyteで、3世代管理します。
作成した「log4net.xml」は実行ディレクトリに置きます。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<log4net>
<appender name="DebugLogDailyAppender" type="log4net.Appender.RollingFileAppender">
<!-- ログ・ファイル名の先頭部分 -->
<param name="File" value=".\log\Trace_" />
<!-- ファイル名の日付部分 -->
<param name="DatePattern" value='yyyyMMdd".log"' />
<!-- 日付ごとにファイルを作成することを指定 -->
<param name="RollingStyle" value="date" />
<!-- ログ・ファイル名が固定ではないので“false”を指定 -->
<param name="StaticLogFileName" value="false" />
<!-- 追加書き込み -->
<param name="AppendToFile" value="true" />
<!-- 全てのログ・レベルとする -->
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMax" value="FATAL" />
<param name="LevelMin" value="DEBUG" />
</filter>
<!-- rollingStyle がSizeまたはCompositeの時の最大ファイルサイズ -->
<param name="MaximumFileSize" value="10MB" />
<!-- ファイルを切替えるマックス数。ここでは3世代まで管理する -->
<param name="MaxSizeRollBackups" value="3" />
<!-- ログの出力書式 -->
<layout type="log4net.Layout.PatternLayout">
<ConversionPattern value="%date [%thread] [%-5level] %logger %file(%line) %class %method - %message%n" />
</layout>
</appender>
<!-- デバッグ以上のログを出力したい場合 -->
<level value="Debug" />
<!-- どのログ出力先を使用するか -->
<appender-ref ref="DebugLogDailyAppender" />
</root>
</log4net>
</configuration>
ログ出力用インスタンス(logger)の取得
ログを出力するためには、loggerと呼ばれるログ出力用のインスタンスを取得する必要があります。そのため、ログ出力を行いたいクラスでは、次の1文を宣言します。
private static readonly log4net.ILog logger=
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
ログ出力のコードの埋め込み
loggerが正しく取得できていれば、loggerのメソッドからログの出力ができます。
logger.Fatal("log4netによるログ出力例~Fatal(致命的障害)");
logger.Error("log4netによるログ出力例~Error(障害)");
logger.Warn("log4netによるログ出力例~Warn(警告)");
logger.Info("log4netによるログ出力例~Info(情報)");
logger.Debug("log4netによるログ出力例~Degug(デバッグ・トレース用)");