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

Windows services 如何停止TopShelf使用log4net创建多个日志文件?,windows-services,log4net,topshelf,Windows Services,Log4net,Topshelf,我的TopShelf托管的Windows服务之一正在创建类似以下内容的重复日志文件: myapp.20140729.log myapp.20140729.log.20140729.log public static void Main(string[] args) { XmlConfigurator.Configure(); var log = LogManager.GetLogger(typeof(MyService)); var container = new Co

我的TopShelf托管的Windows服务之一正在创建类似以下内容的重复日志文件:

myapp.20140729.log
myapp.20140729.log.20140729.log
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();
    });
}
以前在StackOverflow上也描述过类似的问题-中的解决方案对我不起作用,但表明这可能是由于两次初始化日志系统引起的

我正在使用TopShelf Log4Net插件,但我也在做自己的Log4Net日志记录,需要在服务实际启动之前访问
ILog
实例,因此我的代码如下所示:

myapp.20140729.log
myapp.20140729.log.20140729.log
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();
    });
}
publicstaticvoidmain(字符串[]args){
XmlConfigurator.Configure();
var log=LogManager.GetLogger(typeof(MyService));
var container=新容器();
注册表组件(容器、日志);
InfoFormat(“启动MyService”);
运行服务(集装箱);
}
公共静态void运行服务(容器){
HostFactory.Run(x=>{
x、 服务(s=>{
s、 ConstructUsing(name=>container.Resolve());
s、 开始时(f=>f.Start());
s、 停止时(f=>f.Stop());
});
x、 RunAsLocalService();
x、 SetDescription(“我的服务”);
x、 SetDisplayName(“我的服务”);
x、 SetServiceName(“MyService”);
x、 UseLog4Net();
});
}
我做了一些挖掘,似乎在我的
RunService
方法中调用
x.UseLog4Net()
实际上是在运行
XmlConfigurator.Configure()
-请参见TopShelf代码中的

所以

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

  • 调用
    Hostfactory.New
    而不是
    Hostfactory.Run
    要获取对主机的引用,请执行日志记录,然后在主机上调用Run()方法:

    var host = HostFactory.New(configureService);
    var log = LogManager.GetLogger(typeof(MyService));
    log.InfoFormat("Starting MyService");
    host.Run();
    
    另一种方法是,完成初始日志记录后,调用清除配置并允许TopShelf重新加载:

    将存储库实例中包含的所有值重置为其 默认值。这将从所有记录器中删除所有附加器,并设置级别 在所有非根记录器中,将其可加性标志设置为true 并将根记录器的级别设置为调试。此外,信息 禁用设置为其默认的“关闭”值