Внедрение и использование оболочки-регистратора для Serilog

1

Этот вопрос связан с Steven s answer - здесь. Он предложил очень хорошую упаковку для логгера. Я вставлю его код ниже:

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.

  • 1
    почему ты имеешь в виду себя? : D это круговая ссылка
  • 2
    @Sherlock, так как это всего лишь копия идентичного вопроса (заданного кем-то другим) о log4net. Мне просто нужно было, чтобы эта информация была публично документирована, и stackoverflow очень полезен для этого.
Показать ещё 2 комментария
Теги:
logging
serilog

1 ответ

3
Лучший ответ

Итак, мой вопрос в том, как правильно создать реализацию, которая проксирует 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, то есть используете 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);
  • 0
    Как это следует использовать с текущим внедрением зависимостей, используемым в Core 2.2? В ConfigureServices у меня есть: services.AddSingleton <ILogger, SerilogAdapter> (); Проблема в том, что возникает следующая ошибка: InvalidOperationException: невозможно разрешить службу для типа «Serilog.ILogger» при попытке активировать «MyProject.Logging.Adapters.SerilogAdapter».

Ещё вопросы

Сообщество Overcoder
Наверх
Меню