2016-08-17 7 views
2

Я пытаюсь войти в систему с помощью 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(); 

Я не думаю, что действительно имеет значение здесь, но кто знает.

ответ

1

Возможно, что конфигурация InRequestScope Ninject распоряжается регистратором в конце каждого запроса. Регистраторы Serilog (и раковины) смываются и закрываются при удалении, что объясняет, почему события, возникающие синхронно в контроллере, проходят через него.

Чтобы проверить это, попробуйте зарегистрировать регистратор как одноэлементный.

(Вы должны убедиться, что есть только один экземпляр log создан, но я полагаю, на ToConstant(log), что вы устанавливаете это только один раз.)

+0

Высокий. Вот и все. Я изменил 'InRequestScope()' на 'InSingletonScope()', и похоже, что он работает каждый раз сейчас. Странно, однако, то, что вы сказали, имеет смысл в отношении асинхронных действий, но не объясняет, почему не-асинхронное действие регистрировалось только один раз. Похоже, он всегда или всегда или всегда работал. Несмотря на это, это изменение тоже помогло. –

 Смежные вопросы

  • Нет связанных вопросов^_^