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)
您只设置了一次。)
我正在尝试使用 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)
您只设置了一次。)