ログ出力ライブラリ(log4net)について説明していきます。
アグリモの製品では、ひかりFAX電話CTIで使用しています。log4net 以外に Nlog もありますが、アグリモでは log4net の方を採用しています。理由は、Apache が製作している点とあとは長年の実績を評価しました。
1.新規にソリューションを作成します。
2.パッケージマネージャーコンソールで、「Install-Package log4net」と入力してEnterキーを押下します。
3.プロジェクトの参照にDLLが追加されます。
4.Properties の中にある AssemblyInfo.cs を開いて、以下の行を追加します。
1 2 |
// log4net configuration file [assembly: log4net.Config.XmlConfigurator(ConfigFile = @"log4net.config", Watch = true)] |
5.プロジェクトに log4net.config を追加します。
log4net.config のプロパティを開いて、「ビルドアクション」を「コンテンツ」に、「出力ディレクトリにコピー」を「常にコピーする」に変更します。
以下は log4net.config のサンプルです。(ひかりFAX電話CTIのものです。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
<?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 は、メッセージボックスの表示と同時にログ出力も行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
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); } } } |