Serilog仅在构建后第一次调用时记录

时间:2016-11-22 14:03:49

标签: ninject serilog

我有一个使用Ninject for IoC的ASP NET MVC项目。添加了Serilog记录器

  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);
    }
  }

并将其注入控制器。

当我运用使用它进行记录的代码时,它会记录一次,然后再重新登录,直到我重新启动网络应用程序。

我在Windows服务中使用相同的配置代码(没有ninject),工作正常。

安装的版本是

<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)

更新2:

结果证明这是IDependencyResolver在我们的项目中实现的方式中的一个错误。 IDependencyResolver实现了IDisposable,我们的实现在内核上调用了dispose。 (不呢?)幸运的是,这之前从未引起过一个问题。

我已将<{3}}回复标记为 回答,因为他指向我的SelfLog给了我放松发生的事情的工具。感谢所有帮助!

2 个答案:

答案 0 :(得分:4)

您是否尝试检查Serilog自我日志的输出,以查看内部是否发生错误?

e.g。

Serilog.Debugging.SelfLog.Enable(msg => Console.WriteLine(msg));

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

答案 1 :(得分: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()