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に対して名前を指定してAppenderを削除します。 /// </summary> /// <param name="log">ILogインスタンス</param> /// <param name="name">削除したいAppenderの名前</param> /// <returns>削除されたAppender</returns> public static IAppender RemoveCurrentAppender(this ILog log, string name) { // 現在の Logger を取得 var logger = (Logger)log.Logger; // 現在の Logger から Appender を削除 return logger.RemoveAppender(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に対して名前を指定してAppenderを削除します。 /// </summary> /// <param name="log">ILogインスタンス</param> /// <param name="name">削除したいAppenderの名前</param> /// <returns>削除されたAppender</returns> public static IAppender RemoveRootAppender(this ILog log, string name) { // ルートの Logger を取得 var logger = ((Hierarchy)log.Logger.Repository).Root; // ルートの Logger から Appender を削除 return logger.RemoveAppender(name); } } }
サンプルコード まとめ
namespace log4net { using System; using log4net.Appender; using log4net.Repository.Hierarchy; /// <summary> /// log4net.Appender.IAppender を取得する拡張機能を提供します。 /// </summary> public static class LoggerExtensions { /// <summary> /// 現在の log4net.ILog インスタンスから指定された Appender を削除します。 /// </summary> /// <param name="log">log4net.ILog インスタンス</param> /// <param name="name">削除したい Appender の名前</param> /// <returns>削除された log4net.Appender.IAppender</returns> public static IAppender RemoveAppender(this ILog log, string name) { // 現在のLoggerからAppenderを削除 var appender = log.RemoveCurrentAppender(name); // 現在のLoggerで削除できたかどうか if (appender != null) { return appender; } // ルートのLoggerからAppenderを削除 appender = log.RemoveRootAppender(name); return appender; } /// <summary> /// 現在のLoggerに対して名前を指定してAppenderを削除します。 /// </summary> /// <param name="log">ILogインスタンス</param> /// <param name="name">削除したいAppenderの名前</param> /// <returns>削除されたAppender</returns> public static IAppender RemoveCurrentAppender(this ILog log, string name) { var logger = (Logger)log.Logger; return logger.RemoveAppender(name); } /// <summary> /// ルートのLoggerに対して名前を指定してAppenderを削除します。 /// </summary> /// <param name="log">ILogインスタンス</param> /// <param name="name">削除したいAppenderの名前</param> /// <returns>削除されたAppender</returns> public static IAppender RemoveRootAppender(this ILog log, string name) { var logger = ((Hierarchy)log.Logger.Repository).Root; return logger.RemoveAppender(name); } } }
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!