2016-09-14 6 views
1

Этот вопрос связан с ответом Steven - here. Он предложил очень хорошую упаковку для логгера. Я вставить свой код ниже:Внедрение и использование обертки регистратора для Serilog

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.

+0

почему ты со ссылкой на себя? : D это круговая ссылка – Sherlock

+0

@Sherlock, так как это всего лишь копия идентичного вопроса (заданного кем-то еще) о log4net. Я просто нуждался в том, чтобы эту информацию публично документировали, а stackoverflow очень полезен для этого. – Steven

ответ

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

Означает ли это, что каждый класс, который будет регистрировать н (так в основном каждый), должен иметь 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);