Avoid string.Split in LoggerRuleSelector.IsBetter (#44753)
authorStephen Toub <stoub@microsoft.com>
Wed, 18 Nov 2020 20:02:11 +0000 (15:02 -0500)
committerGitHub <noreply@github.com>
Wed, 18 Nov 2020 20:02:11 +0000 (15:02 -0500)
src/libraries/Microsoft.Extensions.Logging/src/LoggerRuleSelector.cs

index 1f3aa52..7ebce26 100644 (file)
@@ -7,8 +7,6 @@ namespace Microsoft.Extensions.Logging
 {
     internal class LoggerRuleSelector
     {
-        private static readonly char[] WildcardChar = { '*' };
-
         public void Select(LoggerFilterOptions options, Type providerType, string category, out LogLevel? minLevel, out Func<string, string, LogLevel, bool> filter)
         {
             filter = null;
@@ -40,7 +38,6 @@ namespace Microsoft.Extensions.Logging
             }
         }
 
-
         private static bool IsBetter(LoggerFilterRule rule, LoggerFilterRule current, string logger, string category)
         {
             // Skip rules with inapplicable type or category
@@ -49,19 +46,32 @@ namespace Microsoft.Extensions.Logging
                 return false;
             }
 
-            if (rule.CategoryName != null)
+            string categoryName = rule.CategoryName;
+            if (categoryName != null)
             {
-                string[] categoryParts = rule.CategoryName.Split(WildcardChar);
-                if (categoryParts.Length > 2)
+                const char WildcardChar = '*';
+
+                int wildcardIndex = categoryName.IndexOf(WildcardChar);
+                if (wildcardIndex != -1 &&
+                    categoryName.IndexOf(WildcardChar, wildcardIndex + 1) != -1)
                 {
                     throw new InvalidOperationException("Only one wildcard character is allowed in category name.");
                 }
 
-                string prefix = categoryParts[0];
-                string suffix = categoryParts.Length > 1 ? categoryParts[1] : string.Empty;
+                ReadOnlySpan<char> prefix, suffix;
+                if (wildcardIndex == -1)
+                {
+                    prefix = categoryName.AsSpan();
+                    suffix = default;
+                }
+                else
+                {
+                    prefix = categoryName.AsSpan(0, wildcardIndex);
+                    suffix = categoryName.AsSpan(wildcardIndex + 1);
+                }
 
-                if (!category.StartsWith(prefix, StringComparison.OrdinalIgnoreCase) ||
-                    !category.EndsWith(suffix, StringComparison.OrdinalIgnoreCase))
+                if (!category.AsSpan().StartsWith(prefix, StringComparison.OrdinalIgnoreCase) ||
+                    !category.AsSpan().EndsWith(suffix, StringComparison.OrdinalIgnoreCase))
                 {
                     return false;
                 }