【发布时间】: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()一起是必要的。值得一试吗?