ASP.MVC 城堡 Nlog 计数不重置
ASP.MVC Castle Nlog Count does not reset
目前使用 Castle Windsor IoC 容器和 NLog 作为我的日志记录工具。
除了 Count 字段在单独的 Web 请求中继续递增之外,一切都已连接并正常工作。安装非常普通,配置也是如此。
我的猜测是没有为每个请求创建一个新的记录器,但我一直无法找到一种方法来在日志记录工具上为每个 Web 请求设置生命周期。
已经在互联网上搜索并尝试了大约 8 个小时的不同安装方法,但现在卡住了。
当前安装程序如下所示:
public class LoggingInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.AddFacility<LoggingFacility>(l => l.UseNLog());
}
}
控制器激活器
public class WindsorHttpControllerActivator : IHttpControllerActivator
{
private readonly IWindsorContainer _container;
public WindsorHttpControllerActivator(IWindsorContainer container)
{
_container = container;
}
public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
{
var controller = (IHttpController)_container.Resolve(controllerType);
request.RegisterForDispose(new Release(() => _container.Release(controller)));
return controller;
}
private class Release : IDisposable
{
private readonly Action _release;
public Release(Action release)
{
_release = release;
}
public void Dispose()
{
_release();
}
}
}
全球
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), new WindsorHttpControllerActivator(_container));
}
THE_PROBLEM:如果我对该网站上的服务进行 2 次调用并在每次调用中添加 5 条日志,则线程 1 上的数据将从 1->5 变为线程 2 上的 6->10。
THE_DESIRED_RESULT:预期结果在线程 1 上为 1->5,在线程 2 上为 1->5
提前致谢!
所以我能够通过以下操作获得所需的结果
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(
Component
.For<ILoggerFactory>()
.ImplementedBy <NLogFactory>()
.DependsOn(Dependency.OnValue("configFile", "nlog.config"))
.LifestylePerWebRequest(),
Component.For<ILogger>()
.UsingFactoryMethod(
(kernel, model, context) =>
{
var logger = kernel.Resolve<ILoggerFactory>()
.Create(context.Handler.ComponentModel.ComponentName.Name);
return logger;
})
.LifestylePerWebRequest()
);
}
不是温莎大师,所以不太确定不使用 LoggingFacility 是否会丢失任何东西。
通过使用 ILogger 和 ILoggerFactory,我确实保持了按需更改记录器的能力,所以我认为我在这方面做得很好
目前使用 Castle Windsor IoC 容器和 NLog 作为我的日志记录工具。 除了 Count 字段在单独的 Web 请求中继续递增之外,一切都已连接并正常工作。安装非常普通,配置也是如此。
我的猜测是没有为每个请求创建一个新的记录器,但我一直无法找到一种方法来在日志记录工具上为每个 Web 请求设置生命周期。
已经在互联网上搜索并尝试了大约 8 个小时的不同安装方法,但现在卡住了。
当前安装程序如下所示:
public class LoggingInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.AddFacility<LoggingFacility>(l => l.UseNLog());
}
}
控制器激活器
public class WindsorHttpControllerActivator : IHttpControllerActivator
{
private readonly IWindsorContainer _container;
public WindsorHttpControllerActivator(IWindsorContainer container)
{
_container = container;
}
public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
{
var controller = (IHttpController)_container.Resolve(controllerType);
request.RegisterForDispose(new Release(() => _container.Release(controller)));
return controller;
}
private class Release : IDisposable
{
private readonly Action _release;
public Release(Action release)
{
_release = release;
}
public void Dispose()
{
_release();
}
}
}
全球
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), new WindsorHttpControllerActivator(_container));
}
THE_PROBLEM:如果我对该网站上的服务进行 2 次调用并在每次调用中添加 5 条日志,则线程 1 上的数据将从 1->5 变为线程 2 上的 6->10。
THE_DESIRED_RESULT:预期结果在线程 1 上为 1->5,在线程 2 上为 1->5
提前致谢!
所以我能够通过以下操作获得所需的结果
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(
Component
.For<ILoggerFactory>()
.ImplementedBy <NLogFactory>()
.DependsOn(Dependency.OnValue("configFile", "nlog.config"))
.LifestylePerWebRequest(),
Component.For<ILogger>()
.UsingFactoryMethod(
(kernel, model, context) =>
{
var logger = kernel.Resolve<ILoggerFactory>()
.Create(context.Handler.ComponentModel.ComponentName.Name);
return logger;
})
.LifestylePerWebRequest()
);
}
不是温莎大师,所以不太确定不使用 LoggingFacility 是否会丢失任何东西。
通过使用 ILogger 和 ILoggerFactory,我确实保持了按需更改记录器的能力,所以我认为我在这方面做得很好