Serilog只能在非异步操作上写入,即使这样,也只能在第一次运行时才接收

时间:2016-08-17 19:33:52

标签: 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")
    .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(nodes) {
        AutoRegisterTemplate = true
    })
    .CreateLogger();

异步控制器操作总是从不记录任何内容,非异步控制器操作只记录首次加载。对同一操作的每个子请求请求都不起作用。我通过创建一个非常简单的测试平台来证实这一点:

[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();
}

在多次执行这两个操作后,我只有一个日志条目:“测试操作”。

我正在获取任何日志(将其同时发送到SQL Server和Elasticsearch)这一事实表明所有内容都已正确配置。然而,我完全失去了为什么只有一些人在制造它而不是其他人。此外,我认为由于批处理可能会延迟时间,但我现在已经等了几个小时,没有任何事情出现过。

为了确认没有异常被提出,我添加了以下内容:

Serilog.Debugging.SelfLog.Enable((msg) => System.Diagnostics.Debug.WriteLine(msg));

但是没有任何内容记录到调试输出中。

最后,为了它的价值,我正在使用Ninject来注入Serilog实例:

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

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

1 个答案:

答案 0 :(得分:1)

Ninject的InRequestScope配置可能会在每个请求结束时处理记录器。 Serilog记录器(和水槽)在处理时冲洗和关闭,这可以解释为什么在控制器中同步引发的事件正在通过。

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

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