我正在使用Serilog。为了避免在每个微服务中进行配置,我创建了一个扩展名为的私有NuGet包
namespace DFX.Logging
{
public static class Extensions
{
public static IWebHostBuilder UseLogging(this IWebHostBuilder webHostBuilder) =>
webHostBuilder.UseSerilog((context, loggerConfiguration) =>
{
var logLevel = context.Configuration.GetValue<string>("Serilog:MinimumLevel");
if (!Enum.TryParse<LogEventLevel>(logLevel, true, out var level))
{
level = LogEventLevel.Information;
}
loggerConfiguration.Enrich
.FromLogContext()
.MinimumLevel.Is(level);
loggerConfiguration
.ReadFrom.Configuration(context.Configuration)
.WriteTo.Console(
theme: AnsiConsoleTheme.Code,
outputTemplate: "[{Timestamp:yy-MM-dd HH:mm:ss} {Level:u3}] {Message:lj} <s:{SourceContext}>{NewLine}{Exception}");
});
}
}
在控制器(或其他地方)我创建记录器
private readonly ILogger _logger = Log.ForContext<Application>();
因为我需要使用using Serilog;
添加。我想避免它,只使用我的命名空间using DFX.Logging;
。我怎么能富裕呢?到目前为止我尝试过的:
namespace DFX.Logging
{
// custom wrapper
public static class Log
{
public static ILogger ForContext<TSource>()
{
return (ILogger)Serilog.Log.ForContext<TSource>();
}
}
public interface ILogger : Serilog.ILogger
{
}
}
然后代码编译成功但在我得到的运行时
'无法将'Serilog.Core.Logger'类型的对象强制转换为'DFX.Logging.ILogger'。'
我意识到我不能将Serilog.Core.Logger
投射到我的记录器,因为Serilog.Core.Logger
没有实现DFX.Logging.ILogger
,但它是如何实现的?
简短的回答是:你做不到。至少不像你的想法那么容易。
如果你真的想走这条路,一些选择可能是:
LoggerProxy
类,实现你的ILogger
接口,并包装一个Serilog的ILogger
实例...编写C#代码LoggerProxy
(a.k.a。LoggerInterceptor
)类,使用Castle.DynamicProxy或LinFu.DynamicProxy之类的东西如果您不想依赖自己的日志代理,可以使用具有serilog实现的dot net logging扩展。
https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.logging.ilogger https://github.com/serilog/serilog-extensions-logging