我有一个使用Ninject for IoC的ASP NET MVC项目 . 添加了Serilog Logger
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);
}
}
并将此注入控制器 .
当我运用使用它来记录的代码时,它会记录一次,然后再也不会再记录,直到我重新启动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" />
更新:
继续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给了我放松发生的事情的工具 . 感谢所有的帮助!
2 回答
您是否尝试检查Serilog自我日志的输出,以查看内部是否发生任何错误?
例如
https://github.com/serilog/serilog/wiki/Debugging-and-Diagnostics
第一个问题:您使用的是Ninject.MVC软件包吗?如果没有,我首先尝试这个,因为他们正确地将Ninject容器插入MVC管道 . https://www.nuget.org/packages/Ninject.MVC5/
另外:您有时可能会遇到DI容器的操作订单问题 . 出于这个原因,我发现直接在_1369143中做很多设置逻辑是不安全的 . 我会尝试这样的事情: