2016-11-22 7 views
3

У меня есть проект ASP NET MVC, который использует Ninject для IoC. Заполнили регистратор SerilogSerilog только регистрируется при первом вызове после сборки

public class LoggingModule : BaseModule 
    { 
    public override void Load() 
    { 
     var fileName = "c:\path\file.log"; 
     var loggerConfiguration = new LoggerConfiguration() 
     .WriteTo.RollingFile(fileName, LogEventLevel.Debug) 
     .MinimumLevel.Verbose(); 
     var logger = loggerConfiguration.CreateLogger(); 

     Log.Logger = logger; 
     Bind<ILogger>().ToConstant(logger); 
    } 
    } 

И вводите это в контроллер.

Когда я использую код, который использует его для регистрации, он будет регистрироваться один раз, а затем никогда больше, пока я не перезапущу веб-приложение.

Я использую тот же код конфигурации (без ninject) в службе windows, которая работает нормально.

Версии смонтированные

<package id="Serilog" version="2.3.0" targetFramework="net45" /> 
<package id="Serilog.Sinks.File" version="3.1.0" targetFramework="net45" /> 
<package id="Serilog.Sinks.RollingFile" version="3.2.0" targetFramework="net45" /> 
<package id="Ninject" version="3.2.2.0" targetFramework="net45" /> 
<package id="Ninject.MVC3" version="3.2.1.0" targetFramework="net45" /> 
<package id="Ninject.Web.Common" version="3.2.3.0" targetFramework="net45" /> 
<package id="Ninject.Web.Common.WebHost" version="3.2.3.0" targetFramework="net45" /> 
<package id="Microsoft.AspNet.Mvc" version="5.2.3" targetFramework="net45" /> 

Обновление:

Исходя из Caio's ответа. Я добавил в SelfLog и посмотреть ...

2016-11-22T14:29:25.6317957Z Caught exception while emitting to sink Serilog.Core.Sinks.RestrictedSink: System.ObjectDisposedException: Cannot access a disposed object. 
Object name: 'The rolling log file has been disposed.'. 
    at Serilog.Sinks.RollingFile.RollingFileSink.Emit(LogEvent logEvent) 
    at Serilog.Core.Sinks.SafeAggregateSink.Emit(LogEvent logEvent) 

Update 2:

Это оказалось быть ошибка в том, что IDependencyResolver были реализованы в нашем проекте. IDependencyResolver реализует IDisposable, и наша реализация называется dispose на ядре. (Un?) К счастью, это никогда не вызывало проблемы раньше.

Я отметил, что Caio's ответил как Ответ, потому что он указывал мне на SelfLog, дал мне инструмент, чтобы расслабиться, что происходит. Спасибо всем, что помогло!

+0

Этот вопрос и ответ - http://stackoverflow.com/questions/7395071/is-binding-toconstant-and-calling-insingletonscope-redundant - веди меня задаться вопросом если, возможно, 'InSingletonScope()' необходим вместе с 'ToConstant()' в версии Ninject, которую вы используете. Стоит попробовать? –

ответ

3

Вы пробовали проверить выход из собственного журнала Serilog, чтобы узнать, есть ли какая-либо ошибка внутри?

например.

Serilog.Debugging.SelfLog.Out = Console.Out; 

https://github.com/serilog/serilog/wiki/Debugging-and-Diagnostics

+0

Ох, я этого раньше не видел! –

1

Первый вопрос: Вы используете один из пакетов Ninject.MVC? Если нет, я бы попробовал это первым, так как они правильно подключили контейнер Ninject к конвейеру MVC. https://www.nuget.org/packages/Ninject.MVC5/

Также: Иногда у вас может возникнуть проблема с порядком работы с контейнерами DI. По этой причине я считаю, что небезопасно делать большую логику настройки непосредственно в NinjectModule. Я хотел бы попробовать что-то вроде этого, вместо:

Bind<ILogger>().ToMethod(context => { 
    var fileName = "c:\path\file.log"; 
    var loggerConfiguration = new LoggerConfiguration() 
    .WriteTo.RollingFile(fileName, LogEventLevel.Debug) 
    .MinimumLevel.Verbose(); 
    var logger = loggerConfiguration.CreateLogger(); 

    Log.Logger = logger; 
    }).In <whatever> Scope() 
+0

спасибо, это на шаг ближе, но похоже, что Ninject запускал этот метод каждый раз, даже когда он установлен в область Singleton. Есть шанс, что я пробовал то же самое снова и снова слишком много раз, хотя :) –

+1

Это может быть большой вопрос, но если бы вы могли собрать прототип проекта в github, который отображает ошибку, я мог бы изучить его для вы. Мы делаем это все время с log4net в моем магазине. –

+0

, если я не могу решить это в реальном приложении завтра. Мне все равно придется это сделать, чтобы проверить, могу ли я изолировать происходящее. Поделитесь, если это не поможет мне. –