log4net の Appender を プログラム上で動的に 生成、追加 する 方法

0 件のコメント

log4net の Appender をプログラム上から生成、追加する方法をここでは記載します。 XML設定とプログラム実装がどのような関係にあるかわかりやすくするため、XML設定の例とそのプログラム実装する例の両方を記載しました。

目次

log4net の XML設定

今回、プログラム化するXML設定の例を以下に記載します。 この設定と同じものをプログラム上で実装してみます。 このサンプルでは RollingFileAppender で サイズ基準 にファイル生成するものとなっています。

app.config

<configuration>
    <log4net>
        <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
            <file value="log.txt" />
            <appendToFile value="true" />
            <rollingStyle value="Size" />
            <maxSizeRollBackups value="10" />
            <maximumFileSize value="100KB" />
            <staticLogFileName value="true" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
            </layout>
        </appender>

        <logger name="RollingFileAppenderLogger">
            <level value="ERROR" />
            <appender-ref ref="RollingFileAppender" />
        </logger>
    </log4net>
</configuration>

log4net の 動的(プログラム上) 設定

上記XML設定をプログラムで実装するとどうなるか…をここでは記載します。 ポイントは Appender 生成後に ActivateOptions() を実行することです。 この実装を行うと、一般的に使う XML設定 がなくても動作するようになります。

Program.cs

namespace ConsoleApplication
{
    using log4net;
    using log4net.Appender;
    using log4net.Core;
    using log4net.Layout;
    using log4net.Repository.Hierarchy;

    class Program
    {
        static void Main(string[] args)
        {
            // Logger の生成
            var logger = LogManager.GetLogger("RollingFileAppenderLogger");

            // Appender の生成
            var appender = new RollingFileAppender()
            {
                Name = "RollingFileAppender",
                File = @"log.txt",
                AppendToFile = true,
                RollingStyle = RollingFileAppender.RollingMode.Size,
                MaxSizeRollBackups = 10,
                MaximumFileSize = "100KB",
                StaticLogFileName = true,
                Layout = new PatternLayout("%date [%thread] %-5level %logger [%property{NDC}] - %message%newline")
            };

            // Appender の初期化
            appender.ActivateOptions();

            // 現在の Logger に エラーレベルを設定、Appender を追加
            var currentLogger = (Logger)logger.Logger;
            currentLogger.Level = Level.Error;
            currentLogger.AddAppender(appender);

            //// NOTE: Rootの Logger にエラーレベルを設定、Appender を追加する サンプル
            ////var rootLogger = ((Hierarchy)logger.Logger.Repository).Root;
            ////rootLogger.Level = Level.Error;
            ////rootLogger.AddAppender(appender);
            
            // ログ出力
            logger.Error("サンプルログ出力");
        }
    }
}

[おまけ] ILog インスタンス に IAppender を追加する拡張メソッド

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="newAppender">新しいAppender</param>
        public static void AddCurentAppender(this ILog log, IAppender newAppender)
        {
            // 現在の Logger を取得
            var logger = log.Logger as Logger;

            // 現在の Logger に Appender を追加
            logger.AddAppender(newAppender);
        }

        /// <summary>
        /// ルートの Logger に新しい Appender を追加します。
        /// </summary>
        /// <param name="log">ILogインスタンス</param>
        /// <param name="newAppender">新しいAppender</param>
        public static void AddRootAppender(this ILog log, IAppender newAppender)
        {
            // ルートのLoggerを取得
            var logger = ((Hierarchy)log.Logger.Repository).Root;

            // Appenderを追加
            logger.AddAppender(newAppender);
        }
    }
}