Создать обертку для Serilog - PullRequest
1 голос
/ 19 апреля 2019

Я использую 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, но как это можно реализовать?

Ответы [ 2 ]

5 голосов
/ 19 апреля 2019

Краткий ответ: Вы не можете . По крайней мере, не так легко, как вы думаете.

Если вы действительно хотите пойти по этому пути, некоторые варианты могут быть:

  • Создайте свой собственный статический LoggerProxy класс, который реализует ваш ILogger интерфейс и обернет экземпляр Serilog ILogger, ... написав код C #
  • Создайте динамический класс LoggerProxy (a.k.a. LoggerInterceptor), который генерируется во время выполнения, используя что-то вроде Castle.DynamicProxy или LinFu.DynamicProxy
  • Измените код Serilog для реализации вашего интерфейса и перекомпилируйте его
  • Измените сборку Serilog с помощью .NET IL Weaving, например, используя расширение Fody , для реализации вашего интерфейса
1 голос
/ 24 апреля 2019

Если вы не хотите зависеть от своего собственного прокси-сервера журнала, вы можете использовать расширение ведения журнала dot net, для которого есть реализация serilog.

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

...