C#.NET で Log4Net を利用してログを記録する設定のメモ。
方針
-
ログを %Appdata%\[会社名]\[製品名]\log\ の下に保存したい
[会社名]=Rohinomiya
[製品名]=SampleLog4Net -
ログを以下のように3つに分けたい
- インフォログ(1つのファイルに出力/INFO~WARNレベルのログを保存)
- エラーログ(日付別にファイルを作成/ERROR~FATALのログを保存)
- トレースログ(日付別にファイルを作成/TRACE~FATALのログを保存)
参考:ログレベル
- Fatal システム停止するような致命的な障害
- Error システム停止はしないが、問題となる障害
- Warn 障害ではない注意警告
- Info 操作ログなどの情報
- Debug 開発用のデバッグメッセージ
- trace 詳細なデバッグの出力
設定手順
- Log4Net公式サイトからLog4Net.dllをダウンロードし、C#プロジェクトの参照設定に追加
- AssemblyInfo.cs に追記: Log4Netの設定ファイルを読み込む
- Log4Netの設定ファイルを記述する(Log4net.Config.xml) 出力フォルダにコピーする=TRUE
- Program.cs にて、Loggerオブジェクトを生成すれば、あとはログを吐くだけ
AssemblyInfo.cs に追記
AssemblyInfo.cs
// read Log4Net Configuration file
[assembly: log4net.Config.XmlConfigurator(ConfigFile=@"Log4net.Config.xml", Watch=true)]
Log4net.Config.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
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("システムが停止する致命的な障害が発生");
}
実行結果
info.log
2012-07-28 17:48:32,443 [1] [INFO ] SampleLog4Net.Program - 情報(操作履歴等)
2012-07-28 17:48:32,445 [1] [WARN ] SampleLog4Net.Program - 注意/警告(障害の一歩手前)
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 - システムが停止する致命的な障害が発生
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
- 特殊ディレクトリのパスを取得する: .NET Tips: C#, VB.NET
- 【Visual Studio C#】[Log4Netを使用する]|No Title
- log4net - MLEXP Wiki
- logging - How to specify common application data folder for log4net? - Stack Overflow
- 【ハウツー】レッツ! Windows 7 - ユーザーインタフェース編(9) (2) 使用頻度の高いフォルダーを環境変数に登録する | パソコン | マイナビニュース
- オープンソースのロギング・サービス「log4net」を使う - @IT
- log4net でログレベル毎に出力先を指定する - 記憶は削除の方向で