首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从ILogger到微软的ILogger?

从ILogger到微软的ILogger?
EN

Stack Overflow用户
提问于 2022-03-04 11:16:03
回答 1查看 531关注 0票数 -1

我通常将注入与Serilog和ILogger结合使用,但在这种情况下,我不得不创建自己的ILogger,如下所示:

代码语言:javascript
复制
private static readonly ILogger _logger = Serilog.Log.ForContext<MyClass>() as ILogger;

然而,我确实需要一个微软ILogger,是否有任何方法从Serilog创建微软ILogger,或者将现有的ILogger转换为ILogger?

编辑1:说得很清楚,该项目是一个使用"IHostBuilder.UseSerilog“将微软ILogger注入到类的.net微服务。但是,在这种特殊情况下,我不能注入ILogger,这将创建一个循环关系。因此,要解决这个问题,我必须在上下文中手动创建它(上面的例子)。

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

因此,要么我需要将Serilog ILogger转换为ILogger,或者更好的是让Serilog创建一个ILogger。

实际上,如果我能够避免在代码中添加更多的Serilog内容,那么如果以后需要切换日志系统,就会更加困难。

编辑2:

我试过这样做:

代码语言:javascript
复制
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”不显示。现在,它越来越倾向于将日志记录排除在代码的这一部分之外。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-08 10:43:59

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

代码语言:javascript
复制
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;
        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71350624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档