Serilog 仅在非异步操作时写入接收器,即便如此,也仅在第一个 运行

Serilog writing to sinks only on non-async actions and, even then, only on first run

我正在尝试使用 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();
}

多次点击这两个操作后,我只有一个日志条目:"Test Action"。

我收到 any 日志(它们同时发送到 SQL 服务器和 Elasticsearch)这一事实表明一切都已正确配置。但是,对于为什么只有一些人成功而其他人没有,我完全不知所措。另外,我认为时间可能只是由于批处理而延迟,但我已经等了几个小时了,什么也没有出现。

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

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

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

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

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

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

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

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

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