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