如何阻止TopShelf使用log4net创建多个日志文件?

时间:2014-07-29 17:08:03

标签: windows-services log4net topshelf

我的一个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代码中。

因此...

  1. 我是否认为调用XmlConfigurator.Configure()两次可能导致我的重复日志文件问题?
  2. 如果是这样 - 我如何将现有配置注入TopShelf,或者在启动服务之前让TopShelf初始化运行,以便我可以在服务启动之前开始记录?

1 个答案:

答案 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;值。