Serilog的logger包装器的实现和使用

这个问题与史蒂文的答案有关 – 这里 。 他提出了一个非常好的记录器包装器。 我将在下面粘贴他的代码:

public interface ILogger { void Log(LogEntry entry); } public static class LoggerExtensions { public static void Log(this ILogger logger, string message) { logger.Log(new LogEntry(LoggingEventType.Information, message, null)); } public static void Log(this ILogger logger, Exception exception) { logger.Log(new LogEntry(LoggingEventType.Error, exception.Message, exception)); } // More methods here. } 

所以,我的问题是创建代理Serilog的实现的正确方法什么

注意:这个问题与关于log4net的这个问题有关,但现在特定于Serilog。

所以,我的问题是创建代理Serilog的实现的正确方法是什么?

你应该创建类似的东西:

 public class SerilogAdapter : ILogger { private readonly Serilog.ILogger m_Adaptee; public SerilogAdapter(Serilog.ILogger adaptee) { m_Adaptee = adaptee; } public void Log(LogEntry entry) { if (entry.Severity == LoggingEventType.Debug) m_Adaptee.Debug(entry.Exception, entry.Message); if (entry.Severity == LoggingEventType.Information) m_Adaptee.Information(entry.Exception, entry.Message); else if (entry.Severity == LoggingEventType.Warning) m_Adaptee.Warning(entry.Message, entry.Exception); else if (entry.Severity == LoggingEventType.Error) m_Adaptee.Error(entry.Message, entry.Exception); else m_Adaptee.Fatal(entry.Message, entry.Exception); } } 

这是否意味着每个将记录的类(基本上都是每个)都应该在其构造函数中使用ILogger?

正如我从史蒂文斯的回答中所理解的那样:是的,你应该这样做。

以后在代码中使用它的最佳方法是什么?

如果您使用DI容器,则只需使用DI容器将ILogger映射到SerilogAdapter 。 您还需要注册Serilog.ILogger ,或者只是将一个Serilog记录器实例提供给DI容器,以将其注入SerilogAdapter构造函数。

如果您不使用DI容器,即使用Pure DI ,那么您可以执行以下操作:

 Serilog.ILogger log = Serilog.Log.Logger.ForContext("MyClass"); ILogger logging_adapter = new SerilogAdapter(log); var myobject = new MyClass(other_dependencies_here, logging_adapter);