わかりました、質問はすでにGoogleにあり、答えを見つけたので、ここに残します. :)
アペンダーを操作するための鍵は、メソッドIAppenderAttachable
を実装しているため、インターフェースです。AddAppender
removeAppender
によって返されるのLogManager.GetLogger()
は のインスタンスでありILog
、これには プロパティ が含まれていますLogger
。によって返されるオブジェクトはILog.Logger
クラスLogger
インスタンスです。Logger
クラスはインターフェイスを実装し、ロガーのリポジトリを抽出するためのプロパティをIAppenderAttachable
含みます。Repository
リポジトリには、ロガーのすべてのアクティブなアペンダーを含むクラス インスタンス (implements 、、など) をGetAppenders
返すメソッドがあります。AppenderCollection
ICollection
IList
Ienumerable
総括する:
//no need to put it in the static constructor, but in my case it is so
static Logger()
{
logger = LogManager.GetLogger(...);
if (logger.Logger.Repository.GetAppenders().Length == 0) {
(logger.Logger as IAppenderAttachable).AddAppender(CreateConsoleAppender());
}
}
private static ConsoleAppender CreateConsoleAppender()
{
var appender = new ConsoleAppender();
appender.Layout = CreateDefaultLayout();
appender.AddFilter(CreateDefaultFilter());
appender.ActivateOptions(); // if omitted - throws an excpetion
log4net.Config.BasicConfigurator.Configure(appender); //if omitted - no errors, but logging does not work
return appender;
}
private static ILayout CreateDefaultLayout()
{
PatternLayout layout = new PatternLayout();
layout.ConversionPattern = "%d{yyyy-MM-dd hh:mm:ss} - %level %m%n";
layout.ActivateOptions();
return layout;
}
private static IFilter CreateDefaultFilter()
{
LevelRangeFilter filter = new LevelRangeFilter { LevelMin = Level.Info };
filter.ActivateOptions();
return filter;
}
ファイルが見つからないか破損している場合、ファイルlog4net
は例外をスローしませんが(少なくともそのままでは)、ロガーにアペンダーがアタッチされていないことに注意してください。