Serilog ILogger 到 Microsoft ILogger?

Serilog ILogger to Microsoft ILogger?

我通常使用 Serilog 和 ILogger 进行注入,但在这种情况下,我不得不像这样创建自己的 ILogger :

private static readonly ILogger _logger = Serilog.Log.ForContext<MyClass>() as ILogger;

但是我确实需要 Microsoft ILogger,有什么方法可以从 Serilog 创建 Microsoft ILogger 或将现有的 Serilog ILogger 转换为 Microsoft ILogger?

编辑 1: 需要说明的是,该项目是一个 .net 微服务,它使用“IHostBuilder.UseSerilog”将 Microsoft ILogger 的注入提供给 类.但是,在这种特定情况下,我不能注入 ILogger,这会产生循环关系。所以要解决这个问题,我必须在上下文中手动创建它(上面的示例)。

问题是这会创建一个 Serilog ILogger,而我需要使用的方法采用 Microsoft ILogger。

因此,要么我需要将 Serilog ILogger 转换为 Microsoft ILogger,要么更好,获取 Serilog 以创建 Microsoft ILogger。

实际上,如果我能避免在代码中添加更多 Serilog 内容,那将是最好的选择,如果稍后需要切换日志系统,这会变得更加困难。

编辑 2:

我已经试过了:

var logger1 = Serilog.Log.ForContext<MessageQueueSink>() as Serilog.ILogger;

            logger1.Information("test1");

            var loggerFactorytest = new LoggerFactory()
                .AddSerilog(logger1);

            var logger2 = loggerFactory.CreateLogger("Logger");

            logger2.LogInformation("test2");

输出中显示了第一个“test1”,但没有显示“test2”。它现在越来越倾向于从这部分代码中排除日志记录。

我没有找到从 Serilog 获取 MS ILogger 或将 Serilog ILogger 转换为 MS ILogger 的方法,因此我创建了一个自定义的 MS ILogger,它像这样包装了 Serilog ILogger:

public class CustomSerilogger : Microsoft.Extensions.Logging.ILogger
    {
        private readonly ILogger _logger;
        public CustomSerilogger(ILogger logger)
        { _logger = logger; }

        public IDisposable BeginScope<TState>(TState state) => default!;

        public bool IsEnabled(Microsoft.Extensions.Logging.LogLevel logLevel) { return _logger.IsEnabled(LogLevelToLogEventLevel(logLevel)); }

        public void Log<TState>(Microsoft.Extensions.Logging.LogLevel logLevel, Microsoft.Extensions.Logging.EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
        {
            if (!IsEnabled(logLevel))
                return;

            _logger.Write(LogLevelToLogEventLevel(logLevel), exception, state.ToString());
        }

        private LogEventLevel LogLevelToLogEventLevel(Microsoft.Extensions.Logging.LogLevel loglevel)
        {
            switch(loglevel)
            {
                case Microsoft.Extensions.Logging.LogLevel.Debug:
                    return LogEventLevel.Debug;
                case Microsoft.Extensions.Logging.LogLevel.Information:
                    return LogEventLevel.Information;
                case Microsoft.Extensions.Logging.LogLevel.Warning:
                    return LogEventLevel.Warning;
                case Microsoft.Extensions.Logging.LogLevel.Error:
                    return LogEventLevel.Error;
                case Microsoft.Extensions.Logging.LogLevel.Critical:
                    return LogEventLevel.Fatal;
                case Microsoft.Extensions.Logging.LogLevel.None:
                    return LogEventLevel.Verbose;
                case Microsoft.Extensions.Logging.LogLevel.Trace:
                    return LogEventLevel.Verbose;
            }
            return LogEventLevel.Verbose;
        }
    }