public void Select(LoggerFilterOptions options, Type providerType, string category, out LogLevel?minLevel, out Func <string, string, LogLevel, bool> filter)
        {
            filter   = null;
            minLevel = options.MinLevel;// LogLevel.Information

            // Filter rule selection:
            // 1. Select rules for current logger type, if there is none, select ones without logger type specified
            // 2. Select rules with longest matching categories
            // 3. If there nothing matched by category take all rules without category
            // 3. If there is only one rule use it's level and filter
            // 4. If there are multiple rules use last
            // 5. If there are no applicable rules use global minimal level

            // 获取 特性 [ProviderAlias("Console")] 中的别名
            var providerAlias        = ProviderAliasUtilities.GetAlias(providerType);
            LoggerFilterRule current = null;

            foreach (var rule in options.Rules)
            {
                if (IsBetter(rule, current, providerType.FullName, category) ||
                    (!string.IsNullOrEmpty(providerAlias) && IsBetter(rule, current, providerAlias, category)))
                {
                    current = rule;
                }
            }

            if (current != null)
            {
                filter   = current.Filter;
                minLevel = current.LogLevel;
            }
        }
Example #2
0
 /// 配置文件发生更改时,刷新日志过滤规则
 private void RefreshFilters(LoggerFilterOptions filterOptions)
 {
     lock (_sync)
     {
         _filterOptions = filterOptions;
         foreach (var registeredLogger in _loggers)
         {
             var logger = registeredLogger.Value;
             (logger.MessageLoggers, logger.ScopeLoggers) = ApplyFilters(logger.Loggers);
         }
     }
 }