Serilog日志包装器的实现和使用

本文关键字:实现 日志 包装 Serilog | 更新日期: 2023-09-27 18:06:58

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

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?

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);
    }
}

这是否意味着每个类将记录sth(所以基本上每),应该有ILogger在它的构造函数?

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

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

如果您使用的是DI容器,那么只需使用DI容器将ILogger映射到SerilogAdapter。你还需要注册Serilog.ILogger,或者只是给一个Serilog记录器的实例到DI容器注入它到SerilogAdapter构造器。

如果你不使用DI容器,也就是说,你使用纯DI,那么你做这样的事情:

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