我的一个TopShelf托管的Windows服务正在创建如下所示的重复日志文件:
myapp.20140729.log
myapp.20140729.log.20140729.log
之前在StackOverflow上已经描述了类似的问题 - 10639682中的解决方案对我不起作用,但579688表明它可能是由于初始化日志系统两次造成的。
我正在使用TopShelf Log4Net插件,但我也在进行自己的log4net日志记录,并且需要在服务实际启动之前访问ILog
实例,因此我的代码如下所示:
public static void Main(string[] args) {
XmlConfigurator.Configure();
var log = LogManager.GetLogger(typeof(MyService));
var container = new Container();
RegisterComponents(container, log);
log.InfoFormat("Starting MyService");
RunService(container);
}
public static void RunService(Container container) {
HostFactory.Run(x => {
x.Service<PortalAdaptor>(s => {
s.ConstructUsing(name => container.Resolve<MyService>());
s.WhenStarted(f => f.Start());
s.WhenStopped(f => f.Stop());
});
x.RunAsLocalService();
x.SetDescription("My Service");
x.SetDisplayName("My Service");
x.SetServiceName("MyService");
x.UseLog4Net();
});
}
我做了一点挖掘,看来我的x.UseLog4Net()
方法中的RunService
实际上正在运行XmlConfigurator.Configure()
- 请参阅{{3在TopShelf代码中。
因此...
XmlConfigurator.Configure()
两次可能导致我的重复日志文件问题?答案 0 :(得分:1)
调用Hostfactory.New
而不是HostFactory.Run
来获取对主机的引用,进行日志记录,然后调用主机上的Run()方法:
var host = HostFactory.New(configureService);
var log = LogManager.GetLogger(typeof(MyService));
log.InfoFormat("Starting MyService");
host.Run();
另一种方法是,一旦完成初始日志记录,请调用LogManager.ResetConfiguration
清除配置并允许TopShelf重新加载:
将存储库实例中包含的所有值重置为它们 默认值。这将从所有记录器中删除所有appender,设置级别 将所有非root记录器设置为null,将其additivity标志设置为true 并将根记录器的级别设置为Debug。而且,消息 禁用设置为默认值&#34;关闭&#34;值。