Этот вопрос связан с 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.
Итак, мой вопрос в том, как правильно создать реализацию, которая проксирует 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);