我正在尝试使用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();
我认为这不重要,但谁知道呢。
答案 0 :(得分:1)
Ninject的InRequestScope
配置可能会在每个请求结束时处理记录器。 Serilog记录器(和水槽)在处理时冲洗和关闭,这可以解释为什么在控制器中同步引发的事件正在通过。
要验证这一点,请尝试将记录器注册为单身。
(您需要确保只创建了一个log
个实例,但我假设ToConstant(log)
您只设置了一次。{)