Pr.*_*dor 1 c# casting serilog
我正在使用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}");
});
}
}
Run Code Online (Sandbox Code Playgroud)
在控制器(或其他地方)中创建记录器
private readonly ILogger _logger = Log.ForContext<Application>();
Run Code Online (Sandbox Code Playgroud)
为此,我需要使用添加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
{
}
}
Run Code Online (Sandbox Code Playgroud)
然后代码成功编译,但是在运行时我得到了
'无法将类型为'Serilog.Core.Logger'的对象转换为类型为'DFX.Logging.ILogger'。”
我意识到,Serilog.Core.Logger由于Serilog.Core.Logger 未实现DFX.Logging.ILogger,所以无法转换为记录器,但是如何实现?
简短的答案是:您不能。至少不像您的想法那么容易。
如果您真的想走这条路,可以选择以下几种方法:
LoggerProxy类来实现您的ILogger接口,并ILogger通过编写C#代码来包装Serilog的实例LoggerProxy(aka LoggerInterceptor)类。