From e65a5a47b11e3f51673762e97bb96cae1b1b933b Mon Sep 17 00:00:00 2001 From: Lilian Kasem Date: Thu, 31 Oct 2024 10:26:38 -0700 Subject: [PATCH] Utilize RestrictHostLogs flag for logging filters --- .../Diagnostics/ILoggingBuilderExtensions.cs | 4 +-- .../ScriptLoggingBuilderExtensions.cs | 27 ++++++++++++++----- .../ScriptHostBuilderExtensions.cs | 10 ++++++- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/src/WebJobs.Script.WebHost/Diagnostics/ILoggingBuilderExtensions.cs b/src/WebJobs.Script.WebHost/Diagnostics/ILoggingBuilderExtensions.cs index 811ccc8854..2f4505a3a0 100644 --- a/src/WebJobs.Script.WebHost/Diagnostics/ILoggingBuilderExtensions.cs +++ b/src/WebJobs.Script.WebHost/Diagnostics/ILoggingBuilderExtensions.cs @@ -8,12 +8,12 @@ namespace Microsoft.Extensions.Logging { public static class ILoggingBuilderExtensions { - public static void AddWebJobsSystem(this ILoggingBuilder builder) where T : SystemLoggerProvider + public static void AddWebJobsSystem(this ILoggingBuilder builder, bool restrictHostLogs = false) where T : SystemLoggerProvider { builder.Services.AddSingleton(); // Log all logs to SystemLogger - builder.AddDefaultWebJobsFilters(LogLevel.Trace); + builder.AddDefaultWebJobsFilters(LogLevel.Trace, restrictHostLogs); } } } diff --git a/src/WebJobs.Script/Extensions/ScriptLoggingBuilderExtensions.cs b/src/WebJobs.Script/Extensions/ScriptLoggingBuilderExtensions.cs index f1cc8586c5..79b5d8ec54 100644 --- a/src/WebJobs.Script/Extensions/ScriptLoggingBuilderExtensions.cs +++ b/src/WebJobs.Script/Extensions/ScriptLoggingBuilderExtensions.cs @@ -6,7 +6,6 @@ using System.Linq; using Microsoft.AspNetCore.Hosting; using Microsoft.Azure.WebJobs.Script; -using Microsoft.Azure.WebJobs.Script.Config; using Microsoft.Azure.WebJobs.Script.Configuration; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; @@ -16,16 +15,24 @@ namespace Microsoft.Extensions.Logging public static class ScriptLoggingBuilderExtensions { private static ConcurrentDictionary _filteredCategoryCache = new ConcurrentDictionary(); + private static ImmutableArray _allowedLogCategoryPrefixes = ScriptConstants.SystemLogCategoryPrefixes; - public static ILoggingBuilder AddDefaultWebJobsFilters(this ILoggingBuilder builder) + // For testing only + internal static ImmutableArray AllowedSystemLogPrefixes => _allowedLogCategoryPrefixes; + + public static ILoggingBuilder AddDefaultWebJobsFilters(this ILoggingBuilder builder, bool restrictHostLogs = false) { + SetSystemLogCategoryPrefixes(restrictHostLogs); + builder.SetMinimumLevel(LogLevel.None); builder.AddFilter((c, l) => Filter(c, l, LogLevel.Information)); return builder; } - public static ILoggingBuilder AddDefaultWebJobsFilters(this ILoggingBuilder builder, LogLevel level) where T : ILoggerProvider + public static ILoggingBuilder AddDefaultWebJobsFilters(this ILoggingBuilder builder, LogLevel level, bool restrictHostLogs = false) where T : ILoggerProvider { + SetSystemLogCategoryPrefixes(restrictHostLogs); + builder.AddFilter(null, LogLevel.None); builder.AddFilter((c, l) => Filter(c, l, level)); return builder; @@ -38,11 +45,17 @@ internal static bool Filter(string category, LogLevel actualLevel, LogLevel minL private static bool IsFiltered(string category) { - ImmutableArray systemLogCategoryPrefixes = FeatureFlags.IsEnabled(ScriptConstants.FeatureFlagEnableHostLogs) - ? ScriptConstants.SystemLogCategoryPrefixes - : ScriptConstants.RestrictedSystemLogCategoryPrefixes; + return _filteredCategoryCache.GetOrAdd(category, c => _allowedLogCategoryPrefixes.Any(p => c.StartsWith(p))); + } - return _filteredCategoryCache.GetOrAdd(category, c => systemLogCategoryPrefixes.Any(p => category.StartsWith(p))); + private static void SetSystemLogCategoryPrefixes(bool restrictHostLogs) + { + // Once restrictHostLogs is set to true, it stays true for the rest of the application's lifetime + // Set _allowedLogCategoryPrefixes to the restricted prefixes and clear the filter cache + if (restrictHostLogs) + { + _allowedLogCategoryPrefixes = ScriptConstants.RestrictedSystemLogCategoryPrefixes; + } } public static void AddConsoleIfEnabled(this ILoggingBuilder builder, HostBuilderContext context) diff --git a/src/WebJobs.Script/ScriptHostBuilderExtensions.cs b/src/WebJobs.Script/ScriptHostBuilderExtensions.cs index c705b3137d..7c7760ca94 100644 --- a/src/WebJobs.Script/ScriptHostBuilderExtensions.cs +++ b/src/WebJobs.Script/ScriptHostBuilderExtensions.cs @@ -81,7 +81,9 @@ public static IHostBuilder AddScriptHost(this IHostBuilder builder, // Host configuration builder.ConfigureLogging((context, loggingBuilder) => { - loggingBuilder.AddDefaultWebJobsFilters(); + var hostingConfigOptions = applicationOptions.RootServiceProvider.GetService>(); + var restrictHostLogs = RestrictHostLogs(hostingConfigOptions.Value, SystemEnvironment.Instance); + loggingBuilder.AddDefaultWebJobsFilters(restrictHostLogs); string loggingPath = ConfigurationPath.Combine(ConfigurationSectionNames.JobHost, "Logging"); loggingBuilder.AddConfiguration(context.Configuration.GetSection(loggingPath)); @@ -492,6 +494,12 @@ private static IDistributedLockManager GetBlobLockManager(IServiceProvider provi } } + private static bool RestrictHostLogs(FunctionsHostingConfigOptions options, IEnvironment environment) + { + // Feature flag should take precedence over the host configuration + return !FeatureFlags.IsEnabled(ScriptConstants.FeatureFlagEnableHostLogs, environment) && options.RestrictHostLogs; + } + /// /// Gets and removes the specified value, if it exists and is of type T. /// Throws an InvalidOperationException if the key does not exist or is not of type T.