其他分享
首页 > 其他分享> > 日志

日志

作者:互联网

ILoggerFactory 根据日志类型(categoryName)调用 对应的 ILoggerProvider 获取 ILogger

  public interface ILoggerFactory : IDisposable
    {
        ILogger CreateLogger(string categoryName);
        void AddProvider(ILoggerProvider provider);
    }    
   public interface ILogger
    {       
        void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter);    
        bool IsEnabled(LogLevel logLevel);
        IDisposable BeginScope<TState>(TState state);
    }
/// <typeparam name="TCategoryName">The type who's name is used for the logger category name.</typeparam>
    public interface ILogger<out TCategoryName> : ILogger
    {        
    }

 

Start.Configure() 方法中直接注入ILoggerFactory(ps:这个方法非常特殊,这方法的参数可以无穷多个,但是每个参数都必须是DI托管的对象。)

 public static IServiceCollection AddLogging(this IServiceCollection services, Action<ILoggingBuilder> configure)
        {
            if (services == null)
            {
                throw new ArgumentNullException(nameof(services));
            }

            services.AddOptions();

            services.TryAdd(ServiceDescriptor.Singleton<ILoggerFactory, LoggerFactory>());
            services.TryAdd(ServiceDescriptor.Singleton(typeof(ILogger<>), typeof(Logger<>)));

            services.TryAddEnumerable(ServiceDescriptor.Singleton<IConfigureOptions<LoggerFilterOptions>>(
                new DefaultLoggerLevelConfigureOptions(LogLevel.Information)));

            configure(new LoggingBuilder(services));
            return services;
        }
    }

注入到Controller的ILooger到底是哪个Logger?难道只是某一个提供器生成Logger对象?

首先看看到底是哪个ILogger的托管到了容器里(Provider生成Logger对象并没有托管给容器,所以容器注入的Logger肯定不是日志提供器创建的ILogger对象)

在AddLogging() 中看到了

这个Logger就非常有意思, 他的成员变量里有LoggerFactory和LoggerInformation[] 引用 !!!(LoggerInformation是Logger的包装类,主要增加了一些Logger的元数据,可以理解成这就是一个Logger,这个logger就是LoggerProvider创建的Logger)
    public class Logger<T> : ILogger<T>
    {
        private readonly ILogger _logger;

        /// <summary>
        /// Creates a new <see cref="Logger{T}"/>.
        /// </summary>
        /// <param name="factory">The factory.</param>
        public Logger(ILoggerFactory factory)
        {
            if (factory == null)
            {
                throw new ArgumentNullException(nameof(factory));
            }

            _logger = factory.CreateLogger(TypeNameHelper.GetTypeDisplayName(typeof(T)));
        }

 

 public ILogger CreateLogger(string categoryName)
        {
            if (CheckDisposed())
            {
                throw new ObjectDisposedException(nameof(LoggerFactory));
            }

            lock (_sync)
            {
                if (!_loggers.TryGetValue(categoryName, out var logger))
                {
                    logger = new Logger(this)
                    {
                        Loggers = CreateLoggers(categoryName)
                    };
                    _loggers[categoryName] = logger;
                }

                return logger;
            }
        }
       private LoggerInformation[] CreateLoggers(string categoryName)
        {
            var loggers = new LoggerInformation[_providerRegistrations.Count];
            for (int i = 0; i < _providerRegistrations.Count; i++)
            {
                SetLoggerInformation(ref loggers[i], _providerRegistrations[i].Provider, categoryName);
            }

            ApplyRules(loggers, categoryName, 0, loggers.Length);
            return loggers;
        }

 

标签:categoryName,ILogger,services,日志,logger,Logger
来源: https://www.cnblogs.com/cloudsu/p/11819190.html