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

Pau*_*bra 4 ninject serilog

我有一个 ASP NET MVC 项目,它使用 Ninject 进行 IoC。添加了一个 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);
    }
  }
Run Code Online (Sandbox Code Playgroud)

并将其注入控制器。

当我执行使用它来记录的代码时,它会记录一次,然后永远不会再记录,直到我重新启动 Web 应用程序。

我在一个运行良好的 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" />
Run Code Online (Sandbox Code Playgroud)

更新:

Caio的回答之后。我在 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)
Run Code Online (Sandbox Code Playgroud)

更新 2:

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

我标志着卡欧的答案,因为他指着我的SelfLog给我解开发生了什么事的工具答案。感谢所有的帮助!

Cai*_*ete 5

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

例如

Serilog.Debugging.SelfLog.Enable(msg => Console.WriteLine(msg));
Run Code Online (Sandbox Code Playgroud)

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