为Serilog创建一个包装器

问题描述 投票:1回答:2

我正在使用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,但它是如何实现的?

c# casting serilog
2个回答
5
投票

简短的回答是:你做不到。至少不像你的想法那么容易。

如果你真的想走这条路,一些选择可能是:

  • 创建自己的静态LoggerProxy类,实现你的ILogger接口,并包装一个Serilog的ILogger实例...编写C#代码
  • 创建一个在运行时生成的动态LoggerProxy(a.k.a。LoggerInterceptor)类,使用Castle.DynamicProxyLinFu.DynamicProxy之类的东西
  • 修改Serilog的代码以实现您的界面,并重新编译它
  • 通过.NET IL编织修改Serilog的程序集,例如,使用Fody扩展,来实现您的界面

1
投票

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

https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.logging.ilogger https://github.com/serilog/serilog-extensions-logging

© www.soinside.com 2019 - 2024. All rights reserved.