log4net で動的に(プログラム上の変更で)出力先や、ログレベルを変更しようとすると、出力先設定である log4net.Appender.IAppender を取得する必要がでてきます。 ここでは、IAppender を取得する拡張メソッドのサンプルコードを掲載します。
手っ取り早く解決したい場合、末尾の「まとめ」にあるサンプルコードをコピペして拡張メソッドを利用すると取得できます。
目次
現在の Logger から Appender を取得
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 | namespace log4net { using System; using log4net.Appender; using log4net.Repository.Hierarchy; /// <summary> /// log4net.Appender.IAppender を取得する拡張機能を提供します。 /// </summary> public static class LoggerExtensions { /// <summary> /// 名前を指定して現在の Logger から log4net.Appender.IAppender を取得します。 /// </summary> /// <param name="log">ILogインスタンス</param> /// <param name="name">探したい IAppender の名前</param> /// <returns>IAppenderインスタンス</returns> public static IAppender GetCurrentAppender( this ILog log, string name) { // 現在のLoggerを取得 var logger = log.Logger as Logger; // 名前を指定してIAppenderを取得 return logger.GetAppender(name); } } } |
Root の Logger から Appender を取得
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 | namespace log4net { using System; using log4net.Appender; using log4net.Repository.Hierarchy; /// <summary> /// log4net.Appender.IAppender を取得する拡張機能を提供します。 /// </summary> public static class LoggerExtensions { /// <summary> /// 名前を指定してルート Logger から log4net.Appender.IAppender を取得します。 /// </summary> /// <param name="log">ILogインスタンス</param> /// <param name="name">探したい IAppender の名前</param> /// <returns>IAppenderインスタンス</returns> public static IAppender GetRootAppender( this ILog log, string name) { // ルートのLoggerを取得 var logger = ((Hierarchy)log.Logger.Repository).Root; // 名前を指定してIAppenderを取得 return logger.GetAppender(name); } } } |
サンプルコード まとめ
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 | namespace log4net { using System; using log4net.Appender; using log4net.Repository.Hierarchy; /// <summary> /// log4net.Appender.IAppender を取得する拡張機能を提供します。 /// </summary> public static class LoggerExtensions { /// <summary> /// 名前を指定して現在またはルートの Logger から log4net.Appender.IAppender を取得します。 /// </summary> /// <param name="log">ILogインスタンス</param> /// <param name="name">探したい IAppender の名前</param> /// <returns>IAppenderインスタンス</returns> public static IAppender GetAppender( this ILog log, string name) { // 現在の Logger から探す var appender = log.GetCurrentAppender(name); if (appender != null ) { return appender; } // なければルートの Logger から探す return log.GetRootAppender(name); } /// <summary> /// 名前を指定して現在の Logger から log4net.Appender.IAppender を取得します。 /// </summary> /// <param name="log">ILogインスタンス</param> /// <param name="name">探したい IAppender の名前</param> /// <returns>IAppenderインスタンス</returns> public static IAppender GetCurrentAppender( this ILog log, string name) { // 現在のLoggerを取得 var logger = log.Logger as Logger; // 名前を指定してIAppenderを取得 return logger.GetAppender(name); } /// <summary> /// 名前を指定してルート Logger から log4net.Appender.IAppender を取得します。 /// </summary> /// <param name="log">ILogインスタンス</param> /// <param name="name">探したい IAppender の名前</param> /// <returns>IAppenderインスタンス</returns> public static IAppender GetRootAppender( this ILog log, string name) { // ルートのLoggerを取得 var logger = ((Hierarchy)log.Logger.Repository).Root; // 名前を指定してIAppenderを取得 return logger.GetAppender(name); } } } |
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!