diff --git a/src/SerilogWeb.Classic/Classic/ApplicationLifecycleModule.cs b/src/SerilogWeb.Classic/Classic/ApplicationLifecycleModule.cs index 5222736..02945a4 100644 --- a/src/SerilogWeb.Classic/Classic/ApplicationLifecycleModule.cs +++ b/src/SerilogWeb.Classic/Classic/ApplicationLifecycleModule.cs @@ -38,8 +38,7 @@ public static ILogger Logger get => Config.Logger; set => SerilogWebClassic.Configuration = new SerilogWebClassicConfiguration( isEnabled: Config.IsEnabled, - requestLoggingLevel: Config.RequestLoggingLevel, - requestContextLogLevel: Config.RequestContextLogLevel, + logLevelEvaluator: Config.LogLevelEvaluator, requestFilter: Config.RequestFilter, formDataLoggingLevel: Config.FormDataLoggingLevel, customLogger: value, @@ -72,8 +71,7 @@ public static Func RequestFilter if (value == null) throw new ArgumentNullException(nameof(value)); SerilogWebClassic.Configuration = new SerilogWebClassicConfiguration( isEnabled: Config.IsEnabled, - requestLoggingLevel: Config.RequestLoggingLevel, - requestContextLogLevel: Config.RequestContextLogLevel, + logLevelEvaluator: Config.LogLevelEvaluator, requestFilter: value, formDataLoggingLevel: Config.FormDataLoggingLevel, customLogger: Config.CustomLogger, @@ -100,8 +98,7 @@ public static LogPostedFormDataOption LogPostedFormData get => Config.LogPostedFormData; set => SerilogWebClassic.Configuration = new SerilogWebClassicConfiguration( isEnabled: Config.IsEnabled, - requestLoggingLevel: Config.RequestLoggingLevel, - requestContextLogLevel: Config.RequestContextLogLevel, + logLevelEvaluator: Config.LogLevelEvaluator, requestFilter: Config.RequestFilter, formDataLoggingLevel: Config.FormDataLoggingLevel, customLogger: Config.CustomLogger, @@ -122,8 +119,7 @@ public static bool FilterPasswordsInFormData get => Config.FilterPasswordsInFormData; set => SerilogWebClassic.Configuration = new SerilogWebClassicConfiguration( isEnabled: Config.IsEnabled, - requestLoggingLevel: Config.RequestLoggingLevel, - requestContextLogLevel: Config.RequestContextLogLevel, + logLevelEvaluator: Config.LogLevelEvaluator, requestFilter: Config.RequestFilter, formDataLoggingLevel: Config.FormDataLoggingLevel, customLogger: Config.CustomLogger, @@ -144,8 +140,7 @@ public static IEnumerable FilteredKeywordsInFormData get => Config.FilteredKeywordsInFormData; set => SerilogWebClassic.Configuration = new SerilogWebClassicConfiguration( isEnabled: Config.IsEnabled, - requestLoggingLevel: Config.RequestLoggingLevel, - requestContextLogLevel: Config.RequestContextLogLevel, + logLevelEvaluator: Config.LogLevelEvaluator, requestFilter: Config.RequestFilter, formDataLoggingLevel: Config.FormDataLoggingLevel, customLogger: Config.CustomLogger, @@ -166,8 +161,7 @@ public static bool IsEnabled get => Config.IsEnabled; set => SerilogWebClassic.Configuration = new SerilogWebClassicConfiguration( isEnabled: value, - requestLoggingLevel: Config.RequestLoggingLevel, - requestContextLogLevel: Config.RequestContextLogLevel, + logLevelEvaluator: Config.LogLevelEvaluator, requestFilter: Config.RequestFilter, formDataLoggingLevel: Config.FormDataLoggingLevel, customLogger: Config.CustomLogger, @@ -184,12 +178,10 @@ public static bool IsEnabled [Obsolete("Obsolete since v4.1 - Use SerilogWebClassic.Configure(cfg => cfg.LogAtLevel(level))")] public static LogEventLevel RequestLoggingLevel { - get => Config.RequestLoggingLevel; set => SerilogWebClassic.Configuration = new SerilogWebClassicConfiguration( isEnabled: Config.IsEnabled, - requestLoggingLevel: value, + logLevelEvaluator: (httpContext, elapsed) => value, requestFilter: Config.RequestFilter, - requestContextLogLevel: Config.RequestContextLogLevel, formDataLoggingLevel: Config.FormDataLoggingLevel, customLogger: Config.CustomLogger, logPostedFormData: Config.LogPostedFormData, @@ -209,8 +201,7 @@ public static LogEventLevel FormDataLoggingLevel get => Config.FormDataLoggingLevel; set => SerilogWebClassic.Configuration = new SerilogWebClassicConfiguration( isEnabled: Config.IsEnabled, - requestLoggingLevel: Config.RequestLoggingLevel, - requestContextLogLevel: Config.RequestContextLogLevel, + logLevelEvaluator: Config.LogLevelEvaluator, requestFilter: Config.RequestFilter, formDataLoggingLevel: value, customLogger: Config.CustomLogger, @@ -235,8 +226,7 @@ public static Func ShouldLogPostedFormData if (value == null) throw new ArgumentNullException(nameof(value)); SerilogWebClassic.Configuration = new SerilogWebClassicConfiguration( isEnabled: Config.IsEnabled, - requestLoggingLevel: Config.RequestLoggingLevel, - requestContextLogLevel: Config.RequestContextLogLevel, + logLevelEvaluator: Config.LogLevelEvaluator, requestFilter: Config.RequestFilter, formDataLoggingLevel: Config.FormDataLoggingLevel, customLogger: Config.CustomLogger, diff --git a/src/SerilogWeb.Classic/Classic/SerilogWebClassicConfiguration.cs b/src/SerilogWeb.Classic/Classic/SerilogWebClassicConfiguration.cs index 2c0e5c5..fae60f0 100644 --- a/src/SerilogWeb.Classic/Classic/SerilogWebClassicConfiguration.cs +++ b/src/SerilogWeb.Classic/Classic/SerilogWebClassicConfiguration.cs @@ -18,8 +18,7 @@ internal sealed class SerilogWebClassicConfiguration internal SerilogWebClassicConfiguration( bool isEnabled, - LogEventLevel requestLoggingLevel, - Func requestContextLogLevel, + Func logLevelEvaluator, Func requestFilter, LogEventLevel formDataLoggingLevel, ILogger customLogger, @@ -29,8 +28,7 @@ internal SerilogWebClassicConfiguration( IEnumerable filteredKeywordsInFormData) { IsEnabled = isEnabled; - RequestLoggingLevel = requestLoggingLevel; - RequestContextLogLevel = requestContextLogLevel; + LogLevelEvaluator = logLevelEvaluator; RequestFilter = requestFilter; FormDataLoggingLevel = formDataLoggingLevel; CustomLogger = customLogger; @@ -67,8 +65,7 @@ internal SerilogWebClassicConfiguration Edit(Func RequestContextLogLevel { get; } + internal Func LogLevelEvaluator { get; } internal ILogger CustomLogger { get; } internal Func RequestFilter { get; } diff --git a/src/SerilogWeb.Classic/Classic/SerilogWebClassicConfigurationBuilder.cs b/src/SerilogWeb.Classic/Classic/SerilogWebClassicConfigurationBuilder.cs index 16f9699..331f0dd 100644 --- a/src/SerilogWeb.Classic/Classic/SerilogWebClassicConfigurationBuilder.cs +++ b/src/SerilogWeb.Classic/Classic/SerilogWebClassicConfigurationBuilder.cs @@ -17,8 +17,7 @@ public class SerilogWebClassicConfigurationBuilder private bool IsEnabled { get; set; } = true; - private LogEventLevel RequestLoggingLevel { get; set; } - private Func RequestContextLogLevel { get; set; } + private Func LogLevelEvaluator { get; set; } private ILogger CustomLogger { get; set; } private Func RequestFilter { get; set; } @@ -39,8 +38,7 @@ internal SerilogWebClassicConfigurationBuilder(SerilogWebClassicConfiguration co if (configToCopy == null) throw new ArgumentNullException(nameof(configToCopy)); CustomLogger = configToCopy.CustomLogger; IsEnabled = configToCopy.IsEnabled; - RequestLoggingLevel = configToCopy.RequestLoggingLevel; - RequestContextLogLevel = configToCopy.RequestContextLogLevel; + LogLevelEvaluator = configToCopy.LogLevelEvaluator; RequestFilter = configToCopy.RequestFilter; FormDataLoggingLevel = configToCopy.FormDataLoggingLevel; LogPostedFormData = configToCopy.LogPostedFormData; @@ -53,7 +51,7 @@ private void Reset() { CustomLogger = null; IsEnabled = true; - RequestLoggingLevel = LogEventLevel.Information; + LogLevelEvaluator = (ctx, elapsed) => LogEventLevel.Information; RequestFilter = AlwaysFalse; ResetFormDataLogging(); } @@ -71,8 +69,7 @@ internal SerilogWebClassicConfiguration Build() { return new SerilogWebClassicConfiguration( isEnabled: IsEnabled, - requestLoggingLevel: RequestLoggingLevel, - requestContextLogLevel: RequestContextLogLevel, + logLevelEvaluator: LogLevelEvaluator, requestFilter: RequestFilter, formDataLoggingLevel: FormDataLoggingLevel, customLogger: CustomLogger, @@ -112,19 +109,18 @@ public SerilogWebClassicConfigurationBuilder Enable() /// A configuration object to allow chaining public SerilogWebClassicConfigurationBuilder LogAtLevel(LogEventLevel level) { - RequestLoggingLevel = level; + LogLevelEvaluator = (ctx, elapsed) => level; return this; } /// - /// Configure at which level HTTP requests are logged. - /// Default is Information + /// Configure at which level HTTP requests are logged dynamically depending on the context /// - /// Override the default log level based on the current http context and total request time + /// Set the log level based on the current http context and total request time /// A configuration object to allow chaining - public SerilogWebClassicConfigurationBuilder LogAtLevel(Func requestContextLogLevel) + public SerilogWebClassicConfigurationBuilder LogAtLevel(Func logLevelEvaluator) { - RequestContextLogLevel = requestContextLogLevel; + LogLevelEvaluator = logLevelEvaluator; return this; } diff --git a/src/SerilogWeb.Classic/Classic/WebRequestLoggingHandler.cs b/src/SerilogWeb.Classic/Classic/WebRequestLoggingHandler.cs index b8f02c5..60bb63f 100644 --- a/src/SerilogWeb.Classic/Classic/WebRequestLoggingHandler.cs +++ b/src/SerilogWeb.Classic/Classic/WebRequestLoggingHandler.cs @@ -44,9 +44,7 @@ internal void OnLogRequest(SerilogWebClassicConfiguration configuration) var error = _application.Context.GetLastSerilogWebError() ?? _application.Server.GetLastError(); - var configurationLevel = configuration.RequestContextLogLevel != null ? configuration.RequestContextLogLevel(_application.Context, stopwatch.Elapsed) : configuration.RequestLoggingLevel; - - var level = error != null || _application.Response.StatusCode >= 500 ? LogEventLevel.Error : configurationLevel; + var level = error != null || _application.Response.StatusCode >= 500 ? LogEventLevel.Error : configuration.LogLevelEvaluator(_application.Context, stopwatch.Elapsed); if (level == LogEventLevel.Error && error == null && _application.Context.AllErrors != null) { diff --git a/test/SerilogWeb.Classic.Tests/WebRequestLoggingHandlerTests.cs b/test/SerilogWeb.Classic.Tests/WebRequestLoggingHandlerTests.cs index 223d91b..8cc213d 100644 --- a/test/SerilogWeb.Classic.Tests/WebRequestLoggingHandlerTests.cs +++ b/test/SerilogWeb.Classic.Tests/WebRequestLoggingHandlerTests.cs @@ -86,6 +86,40 @@ public void RequestLoggingLevel(LogEventLevel requestLoggingLevel) Assert.Equal(requestLoggingLevel, evt.Level); } + [Theory] + [InlineData(LogEventLevel.Verbose)] + [InlineData(LogEventLevel.Debug)] + [InlineData(LogEventLevel.Information)] + [InlineData(LogEventLevel.Warning)] + [InlineData(LogEventLevel.Error)] + [InlineData(LogEventLevel.Fatal)] + public void RequestLogLevelEvaluator(LogEventLevel requestLoggingLevel) + { + SerilogWebClassic.Configure(cfg => cfg + .LogAtLevel((context, elapsed) => requestLoggingLevel) + ); + + TestContext.SimulateRequest(); + + var evt = LastEvent; + Assert.NotNull(evt); + Assert.Equal(requestLoggingLevel, evt.Level); + } + + [Fact] + public void DynamicRequestLogLevelEvaluator() + { + SerilogWebClassic.Configure(cfg => cfg + .LogAtLevel((context, elapsed) => elapsed.TotalMilliseconds > 3000 ? LogEventLevel.Warning : LogEventLevel.Information) + ); + + TestContext.SimulateRequest(sleepDurationMilliseconds: 4000); + + var evt = LastEvent; + Assert.NotNull(evt); + Assert.Equal(LogEventLevel.Warning, evt.Level); + } + [Fact] public void LogPostedFormData() {