我只想解释一下我在这里做了些什么,试图让这两个世界都变得最好。在这里,我们似乎遇到了一个由来已久的开发难题,即牺牲库的特定功能来遵守可靠的原则。我们以前在存储库抽象之类的东西中看到过这一点,这使得不可能利用它们抽象的一些ORM的粒度特性。
我的SerilogAdapter如下所示:
public class SerilogLogAdapter<T> : ILogger
{
private readonly Serilog.ILogger _logger;
public SerilogLogAdapter(Serilog.ILogger logger)
{
_logger = logger;
}
public void Log(LogEntryDetail logEntryDetail)
{
if (ReferenceEquals(null, logEntryDetail.Layer))
{
logEntryDetail.Layer = typeof(T).Name;
}
if (logEntryDetail.MessageTemplate.Equals(MessageTemplates.LogEntryDetailMessageTemplate, StringComparison.Ordinal))
{
_logger.Write(ToLevel(logEntryDetail.Severity), logEntryDetail.Exception, logEntryDetail.MessageTemplate, logEntryDetail);
}
else
{
_logger.Write(ToLevel(logEntryDetail.Severity), logEntryDetail.MessageTemplate, logEntryDetail.Message, logEntryDetail.AdditionalInfo);
}
}
private static LogEventLevel ToLevel(LoggingEventType severity) =>
severity == LoggingEventType.Debug ? LogEventLevel.Debug :
severity == LoggingEventType.Information ? LogEventLevel.Information :
severity == LoggingEventType.Warning ? LogEventLevel.Warning :
severity == LoggingEventType.Error ? LogEventLevel.Error :
LogEventLevel.Fatal;
}
如果MessageTemplate是一个代表整个对象的模板,那么它将被记录。否则,可以使用自定义MessageTemplate并记录Message属性以及AdditionalInfo属性(字典)。
我们至少还从Serilog中挤出了一件事,这是它的优势之一——能够使用不同的消息模板记录日志,并可以按消息模板搜索日志。
无论如何让我知道它是否能更好!