0

我的 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() 在运行- 请参阅TopShelf 代码中的Log4NetLogWriterFactory,第 62 行

所以...

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

1 回答 1

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 重新加载它:

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

于 2014-07-30T11:48:52.503 回答