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