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,我确实保持了按需更改记录器的能力,所以我认为我在这方面做得很好