我有一个广泛使用log4net的C#(.NET 3.5)应用程序。 log4net配置位于app.config
文件中。
使用[assembly: XmlConfigurator(Watch = true)]
中的AssemlyInfo.cs
完成配置
App使用单个应用程序范围的记录器实例,在logger包装器类的静态构造函数中实例化:
public class Logger{
//....
private static readonly ILog logger;
static Logger()
{
logger = LogManager.GetLogger(Assembly.GetEntryAssembly().GetName().Name);
AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;
}
//....
}
该应用程序旨在通过调度程序在远程服务器上运行,没有人类存在,单独在黑暗中。 :)问题是,如果缺少配置文件,它只是默默地崩溃(没有log4net config =>没有记录)。
有没有办法检查配置中是否有任何appender,如果没有 - 以编程方式添加某种回退appender。
我对log4X记录器系列很新,所以,如果我要求一些微不足道的东西 - 请善待,log4net文档非常糟糕。 :)
答案 0 :(得分:0)
好的,问题已经在谷歌上了,我找到了答案,所以我就把它留在这里。 :)
操纵appender的关键是IAppenderAttachable
接口,因为它实现了AddAppender
,removeAppender
方法。
LogManager.GetLogger()
返回的内容是ILog
的实例,后者又包含属性Logger
。 ILog.Logger
返回的对象是Logger
类实例。 Logger
类实现IAppenderAttachable
接口并包含Repository
属性以提取记录器的存储库。存储库有方法GetAppenders
,它返回AppenderCollection
类实例(实现ICollection
,IList
,Ienumerable
等)和记录器的所有活动的附加程序。 / p>
总结一下:
//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
不会抛出任何异常(至少开箱即用),但没有附加到记录器的附加程序。