Log4Net を利用してログを記録する

C#.NET で Log4Net を利用してログを記録する設定のメモ。

# 方針

1. ログを %Appdata%\\[会社名]\\[製品名]\\log\\ の下に保存したい

	[会社名]=Rohinomiya
	[製品名]=SampleLog4Net

2. ログを以下のように3つに分けたい

	1. インフォログ(１つのファイルに出力／INFO～WARNレベルのログを保存)
	2. エラーログ(日付別にファイルを作成／ERROR～FATALのログを保存)
	3. トレースログ(日付別にファイルを作成／TRACE～FATALのログを保存)

# 参考：ログレベル

* Fatal	システム停止するような致命的な障害
* Error	システム停止はしないが、問題となる障害
* Warn	障害ではない注意警告
* Info	操作ログなどの情報
* Debug	開発用のデバッグメッセージ
* trace	詳細なデバッグの出力

# 設定手順

 1. [Log4Net公式サイトからLog4Net.dllをダウンロード](http://logging.apache.org/log4net/download.html)し、C#プロジェクトの参照設定に追加
 2. AssemblyInfo.cs に追記： Log4Netの設定ファイルを読み込む
 3. Log4Netの設定ファイルを記述する(Log4net.Config.xml) 出力フォルダにコピーする＝TRUE
 4. Program.cs にて、Loggerオブジェクトを生成すれば、あとはログを吐くだけ

# AssemblyInfo.cs に追記

```csharp:AssemblyInfo.cs
// read Log4Net Configuration file
[assembly: log4net.Config.XmlConfigurator(ConfigFile=@"Log4net.Config.xml", Watch=true)]
```

# Log4net.Config.xml

```xml:Log4net.Config.xml
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<log4net>
		
		<!-- 通常ログ：単一ファイル出力 -->
		<appender name="InfoLogDailyAppender" type="log4net.Appender.FileAppender">
			<File value="${APPDATA}\\Rohinomiya\\SampleLog4Net\\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}\\Rohinomiya\\SampleLog4Net\\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}\\Rohinomiya\\SampleLog4Net\\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>
```

# Program.cs

```csharp:program.cs
public static void Main(string[] args)
{
	ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

	logger.Debug("開発中のデバッグ／トレースに使用する");
	logger.Info("情報（操作履歴等）");
	logger.Warn("注意／警告（障害の一歩手前）");
	logger.Error("システムが停止するまではいかない障害が発生");
	logger.Fatal("システムが停止する致命的な障害が発生");
}
```

# 実行結果

![](https://lh6.googleusercontent.com/-nzQPy8iXq5E/UBVZjNucyJI/AAAAAAAAEX4/-iW0h6CqP6Q/s800/2012-07-30_00h39_10.png)

```log:info.log
2012-07-28 17:48:32,443 [1] [INFO ] SampleLog4Net.Program - 情報（操作履歴等）
2012-07-28 17:48:32,445 [1] [WARN ] SampleLog4Net.Program - 注意／警告（障害の一歩手前）
```

```log:Error_20120728.log
2012-07-28 17:48:32,445 [1] [ERROR] SampleLog4Net.Program c:\\develop\SampleLog4Net\SampleLog4Net\Program.cs(26) SampleLog4Net.Program Main - システムが停止するまではいかない障害が発生
2012-07-28 17:48:32,446 [1] [FATAL] SampleLog4Net.Program c:\\develop\SampleLog4Net\SampleLog4Net\Program.cs(28) SampleLog4Net.Program Main - システムが停止する致命的な障害が発生
```

```log:Trace_20120728.log
2012-07-28 17:48:32,420 [1] [DEBUG] SampleLog4Net.Program c:\develop\SampleLog4Net\SampleLog4Net\Program.cs(20) SampleLog4Net.Program Main - 開発中のデバッグ／トレースに使用する
2012-07-28 17:48:32,443 [1] [INFO ] SampleLog4Net.Program c:\develop\SampleLog4Net\SampleLog4Net\Program.cs(22) SampleLog4Net.Program Main - 情報（操作履歴等）
2012-07-28 17:48:32,445 [1] [WARN ] SampleLog4Net.Program c:\develop\SampleLog4Net\SampleLog4Net\Program.cs(24) SampleLog4Net.Program Main - 注意／警告（障害の一歩手前）
2012-07-28 17:48:32,445 [1] [ERROR] SampleLog4Net.Program c:\develop\SampleLog4Net\SampleLog4Net\Program.cs(26) SampleLog4Net.Program Main - システムが停止するまではいかない障害が発生
2012-07-28 17:48:32,446 [1] [FATAL] SampleLog4Net.Program c:\develop\SampleLog4Net\SampleLog4Net\Program.cs(28) SampleLog4Net.Program Main - システムが停止する致命的な障害が発生
2012-07-28 17:48:32,448 [1] [DEBUG] SampleLog4Net.Program c:\develop\SampleLog4Net\SampleLog4Net\Program.cs(34) SampleLog4Net.Program Main - D:\Users\fukuda\AppData\Local
```

# 参考

* [C# how to specify the appData file path in the app.config file - Stack Overflow](http://stackoverflow.com/questions/964132/c-sharp-how-to-specify-the-appdata-file-path-in-the-app-config-file)
* [特殊ディレクトリのパスを取得する: .NET Tips: C#, VB.NET](http://dobon.net/vb/dotnet/file/getfolderpath.html)
* [【Visual Studio C#】［Log4Netを使用する］｜No Title](http://ameblo.jp/dakishimetai-com/entry-10489180388.html)
* [log4net - MLEXP Wiki](http://www.mlexp.com/wiki/?log4net)
* [logging - How to specify common application data folder for log4net? - Stack Overflow](http://stackoverflow.com/questions/468989/how-to-specify-common-application-data-folder-for-log4net)
* [【ハウツー】レッツ! Windows 7 - ユーザーインタフェース編(9) (2) 使用頻度の高いフォルダーを環境変数に登録する | パソコン | マイナビニュース](http://news.mynavi.jp/articles/2010/08/11/w7/001.html)
* [オープンソースのロギング・サービス「log4net」を使う － ＠IT](http://www.atmarkit.co.jp/fdotnet/vblab/extcompo_01/log4net_01.html)
* [log4net でログレベル毎に出力先を指定する - 記憶は削除の方向で](http://d.hatena.ne.jp/re_guzy/20061019/p1)