C# 为Serilog创建包装器

C# 为Serilog创建包装器,c#,casting,serilog,C#,Casting,Serilog,我用的是Serilog。为了避免在每个微服务中进行配置,我创建了一个带有扩展名的私有NuGet包,如 namespace DFX.Logging { public static class Extensions { public static IWebHostBuilder UseLogging(this IWebHostBuilder webHostBuilder) => webHostBuilder.UseSerilog((con

我用的是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}");
            });
    }
}
然后代码编译成功,但在运行时我得到了

“无法将类型为”Serilog.Core.Logger“的对象强制转换为类型” 'DFX.Logging.ILogger'

我意识到我不能将Serilog.Core.Logger强制转换为我的记录器,因为Serilog.Core.Logger没有实现DFX.Logging.ILogger,但是如何实现它呢

简单的回答是:你不能。至少不像你想的那么容易

如果你真的想走这条路,可以选择:

创建自己的实现ILogger接口的静态LoggerProxy类,并通过以下方式包装Serilog的ILogger实例。。。编写C代码 创建一个动态LoggerProxy,也称为LoggerInterceptor类,该类在运行时生成,使用或 修改Serilog的代码以实现您的接口,并重新编译它 通过.NETIL编织修改Serilog的程序集,例如,使用扩展来实现您的接口 简单的回答是:你不能。至少不像你想的那么容易

如果你真的想走这条路,可以选择:

创建自己的实现ILogger接口的静态LoggerProxy类,并通过以下方式包装Serilog的ILogger实例。。。编写C代码 创建一个动态LoggerProxy,也称为LoggerInterceptor类,该类在运行时生成,使用或 修改Serilog的代码以实现您的接口,并重新编译它 通过.NETIL编织修改Serilog的程序集,例如,使用扩展来实现您的接口
如果您不想依赖自己的日志代理,可以使用dotnetlogging扩展,它有一个serilog实现


如果您不想依赖自己的日志代理,可以使用有serilog实现的dot net日志扩展

为什么不使用并删除对Serilog的任何引用将ILogger注入构造函数?为什么不使用并删除对Serilog的任何引用将ILogger注入构造函数?
private readonly ILogger _logger = Log.ForContext<Application>();
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
    {
    }
}