Я пытаюсь войти в систему с помощью Serilog. Прямо сейчас я ударяю два приемника: SQL Server и Elasticsearch (просто чтобы убедиться, что это не проблема с тем или другим). Я также тестирование это в моем Dev среде, используя IIS Express и отладки с Visual Studio 2013. Настройка очень проста:Запись в Serilog только для неасинхронных действий и даже тогда только при первом запуске
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».
Тот факт, что я получаю любые журналов (которые делают это как для SQL Server, так и для Elasticsearch), предполагает, что все настроено правильно. Тем не менее, я в полной мере потерял, почему только некоторые из них делают это, а не другие. Кроме того, я считал, что время может быть просто отложено из-за дозирования, но я сейчас ждал часов, и ничего не появлялось.
Просто, чтобы подтвердить не было никаких исключений быть подняты, я добавил следующее:
Serilog.Debugging.SelfLog.Enable((msg) => System.Diagnostics.Debug.WriteLine(msg));
Но никогда ничего не записывается в отладочный вывод.
Наконец, для чего это стоит, я использую Ninject впрыснуть экземпляр Serilog:
kernel.bind<ILogger>().ToConstant(log).InRequestScope();
Я не думаю, что действительно имеет значение здесь, но кто знает.
Высокий. Вот и все. Я изменил 'InRequestScope()' на 'InSingletonScope()', и похоже, что он работает каждый раз сейчас. Странно, однако, то, что вы сказали, имеет смысл в отношении асинхронных действий, но не объясняет, почему не-асинхронное действие регистрировалось только один раз. Похоже, он всегда или всегда или всегда работал. Несмотря на это, это изменение тоже помогло. –