log4net の Appender を プログラム上で動的に 削除 する 方法

0 件のコメント

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);
        }
    }
}