这个问题与Steven的答案-here有关。他提出了一个很好的记录器包装器。我将在下面粘贴他的代码:

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 的实现的正确方法是什么?

注意:此问题与this question about log4net有关,但现在特定于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);
    }
}



据史蒂文斯回答,据我了解:是的,您应该这样做。



如果使用的是DI容器,则只需使用DI容器将ILogger映射到SerilogAdapter即可。您还需要注册Serilog.ILogger,或仅将Serilog logger的实例提供给DI容器以将其注入(inject)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);

关于c# - Serilog记录器包装程序的实现和使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39499229/

10-12 23:17