Windows services 如何停止TopShelf使用log4net创建多个日志文件?
我的TopShelf托管的Windows服务之一正在创建类似以下内容的重复日志文件: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
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()
两次可能是导致我的重复日志文件问题的原因,对吗调用
Hostfactory.New
而不是Hostfactory.Run
要获取对主机的引用,请执行日志记录,然后在主机上调用Run()方法:
var host = HostFactory.New(configureService);
var log = LogManager.GetLogger(typeof(MyService));
log.InfoFormat("Starting MyService");
host.Run();
另一种方法是,完成初始日志记录后,调用清除配置并允许TopShelf重新加载:
将存储库实例中包含的所有值重置为其
默认值。这将从所有记录器中删除所有附加器,并设置级别
在所有非根记录器中,将其可加性标志设置为true
并将根记录器的级别设置为调试。此外,信息
禁用设置为其默认的“关闭”值