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);
}
}
}
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!