Serilog 仅在构建后第一次调用时记录
Serilog only logging the first time it is called after build
我有一个 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);
}
}
我正在将其注入控制器。
当我运行使用它来记录的代码时,它将记录一次,然后在我重新启动网络应用程序之前不会再记录。
我在 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,这为我提供了解除正在发生的事情的工具。感谢所有的帮助!
您是否尝试过检查 Serilog 自身日志的输出,看看内部是否发生任何错误?
例如
Serilog.Debugging.SelfLog.Enable(msg => Console.WriteLine(msg));
https://github.com/serilog/serilog/wiki/Debugging-and-Diagnostics
第一个问题:您使用的是 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()
我有一个 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);
}
}
我正在将其注入控制器。
当我运行使用它来记录的代码时,它将记录一次,然后在我重新启动网络应用程序之前不会再记录。
我在 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,这为我提供了解除正在发生的事情的工具。感谢所有的帮助!
您是否尝试过检查 Serilog 自身日志的输出,看看内部是否发生任何错误?
例如
Serilog.Debugging.SelfLog.Enable(msg => Console.WriteLine(msg));
https://github.com/serilog/serilog/wiki/Debugging-and-Diagnostics
第一个问题:您使用的是 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()