log4net で 出力先 ファイル名 を 動的に 取得、設定 する 方法

0 件のコメント

FileAppender または RollingFileAppender でファイル出力する際、動的に or プログラム上で 出力ファイル名 を 取得 または 変更 する方法を記載します。

ここでは、「log4netをXMLで設定していたが、途中でそのファイル名を知りたい or ファイル名を変えたい」といったケースを想定しています。 以下では、log4net の 設定例と、その設定のときにどうやってファイル名を取得、設定するかを記載します。

まずは前提となる log4net の設定です。

app.config

<configuration>
    <log4net>
        <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
            <file value="logfile" />
            <appendToFile value="true" />
            <rollingStyle value="Date" />
            <datePattern value="yyyyMMdd-HHmm" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
            </layout>
        </appender>
        <root>
            <level value="ALL" />
            <appender-ref ref="RollingLogFileAppender" />
        </root>
    </log4net>
</configuration>

次に、上記設定のとき 出力先ファイル名を動的に取得、変更するサンプルコードです。

Program.cs

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

    public class Program
    {
        public void TestMethod()
        {
            // Loggerの生成
            var logger = LogManager.GetLogger("samplelogger");

            // RootのLoggerを取得
            var rootLogger = ((Hierarchy)logger.Logger.Repository).Root;

            // RootのAppenderを取得
            var appender = rootLogger.GetAppender("RollingLogFileAppender") as FileAppender;

            // ファイル名の取得
            var filepath = appender.File;

            // ファイル名の設定
            appender.File = @"D:\log\samplelogger";
            appender.ActivateOptions();
        }
    }
}

log4net の設定では、Appender が Root に保存されており、ILog.Logger には保存されていません。 なので、プログラム上でも Root を取得して、該当する Appender にキャストした上でファイル名を取得、設定します。 今回は、Appender は 名前 を指定して取得しています。 ただし、取得されるのは IAppender なので、実装クラスである RollingFileAppender へキャストを行います。 ここでは、RollingFileAppenderの基本クラス(親クラス)である FileAppender へキャストしました。

ファイル名の取得は、Fileプロパティへアクセスすることで取得できます。

ファイル名の設定は、Fileプロパティへ設定した後、ActivateOptions メソッドを実行することで設定、反映させることができます。

関連記事