log4net で動的に(プログラム上の変更で)出力先や、ログレベルを変更しようとすると、出力先設定である log4net.Appender.IAppender を取得する必要がでてきます。 ここでは、IAppender を取得する拡張メソッドのサンプルコードを掲載します。
手っ取り早く解決したい場合、末尾の「まとめ」にあるサンプルコードをコピペして拡張メソッドを利用すると取得できます。
目次
現在の Logger から Appender を取得
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 を取得
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); } } }
サンプルコード まとめ
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 の フォロー」 お願いします!!