Asp.net mvc Serilog仅在非异步操作时写入接收器,即使如此,也仅在第一次运行时写入接收器

Asp.net mvc Serilog仅在非异步操作时写入接收器,即使如此,也仅在第一次运行时写入接收器,asp.net-mvc,asp.net-mvc-5.2,serilog,Asp.net Mvc,Asp.net Mvc 5.2,Serilog,我正在尝试使用Serilog登录。现在,我正在研究两个接收器:SQL Server和Elasticsearch(只是为了确保这两个接收器之间没有问题)。我还在我的开发环境中测试这一点,使用IIS Express并使用Visual Studio 2013进行调试。配置非常简单: var log = new LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.MSSqlServer(logConnectionString, "__

我正在尝试使用Serilog登录。现在,我正在研究两个接收器:SQL Server和Elasticsearch(只是为了确保这两个接收器之间没有问题)。我还在我的开发环境中测试这一点,使用IIS Express并使用Visual Studio 2013进行调试。配置非常简单:

var log = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .WriteTo.MSSqlServer(logConnectionString, "__Serilog")
    .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(nodes) {
        AutoRegisterTemplate = true
    })
    .CreateLogger();
通常,异步控制器操作从不记录任何内容,非异步控制器操作只在第一次加载时记录。对同一操作的每个subsequest请求都不执行任何操作。我通过创建一个非常简单的测试平台来证实这一点:

[Route("test")]
public async Task<ActionResult> Test()
{
    logger.Information("Test Action");
    return View();
}

[Route("testasync")]
public async Task<ActionResult> TestAsync()
{
    logger.Information("Async Test Action");
    return View();
}
但调试输出中从未记录任何内容

最后,值得一提的是,我使用Ninject注入Serilog实例:

kernel.bind<ILogger>().ToConstant(log).InRequestScope();
kernel.bind().ToConstant(log.InRequestScope();

我认为这在这里并不重要,但谁知道呢。

有可能Ninject在RequestScope中的配置是在每个请求结束时处理记录器。Serilog记录器(和接收器)在处理时刷新并关闭,这可以解释为什么控制器中同步引发的事件能够通过

要验证这一点,请尝试将记录器注册为单例


(您需要确保只创建了一个
log
实例,但我通过
ToConstant(log)
假设您只设置了一次。)

太棒了。就这样。我将RequestScope()中的
更改为
InSingletonScope()
,现在它似乎每次都在工作。然而,奇怪的是,您所说的关于异步操作是有意义的,但它没有解释为什么非异步操作只记录一次。似乎它要么总是失败,要么总是奏效。不管怎样,这一变化也起到了作用。
kernel.bind<ILogger>().ToConstant(log).InRequestScope();