【问题标题】:Serilog only logging the first time it is called after buildSerilog 仅在构建后第一次调用时记录
【发布时间】:2017-04-06 06:00:10
【问题描述】:

我有一个将 Ninject 用于 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。 (不?)幸运的是,这以前从未引起过问题。

我已将Caio's 答案标记为 答案,因为他将我指向 SelfLog 为我提供了放松正在发生的事情的工具。感谢所有的帮助!

【问题讨论】:

  • 这个问题和答案 - stackoverflow.com/questions/7395071/… - 让我想知道在您使用的 Ninject 版本中,InSingletonScope() 是否与 ToConstant() 一起是必要的。值得一试吗?

标签: ninject serilog


【解决方案1】:

你有没有试过检查 Serilog 的自我日志的输出,看看内部是否发生了任何错误?

例如

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

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

【讨论】:

  • 哦,我以前从未见过!
【解决方案2】:

第一个问题:您使用的是其中一个 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()

【讨论】:

  • 谢谢,这更近了一步,但看起来 Ninject 每次都在运行该方法,即使设置为单例范围也是如此。不过,我有机会一遍又一遍地尝试同样的事情:)
  • 这可能是一个很大的问题,但如果您可以在 github 中构建一个显示错误的原型项目,我可以为您研究它。我们一直在我的商店使用 log4net 这样做。
  • 如果我明天在真正的应用程序中无法解决它。无论如何,我必须这样做,看看我是否可以隔离正在发生的事情。如果这对我没有帮助,将分享。
  • kk,如果你想让我参与进来,请告诉我。您可能需要在 Twitter (@ISuperGeek) 上标记我以引起我的注意。
猜你喜欢
  • 1970-01-01
  • 2020-03-30
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
相关资源
最近更新 更多