{
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;
}
}
-
private static bool IsBetter(LoggerFilterRule rule, LoggerFilterRule current, string logger, string category)
{
// Skip rules with inapplicable type or category
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;
}