public void ResetLogLevel_Works_OnDefault() { // arrange var provider = new SerilogDynamicProvider(GetConfiguration()); var fac = new LoggerFactory(); fac.AddProvider(provider); var originalLogConfig = provider.GetLoggerConfigurations(); // act provider.SetLogLevel("Default", LogLevel.Information); var updatedLogConfig = provider.GetLoggerConfigurations(); provider.SetLogLevel("Default", null); var resetConfig = provider.GetLoggerConfigurations(); // assert Assert.Contains(new DynamicLoggerConfiguration("Default", LogLevel.Trace, LogLevel.Trace), originalLogConfig); Assert.Contains(new DynamicLoggerConfiguration("Default", LogLevel.Trace, LogLevel.Information), updatedLogConfig); Assert.Contains(new DynamicLoggerConfiguration("Default", LogLevel.Trace, LogLevel.Trace), resetConfig); }
public void SetLogLevel_UpdatesNamespaceDescendants() { // arrange (A* should log at Information) var provider = new SerilogDynamicProvider(GetConfiguration()); // act I: with original setup var childLogger = provider.CreateLogger("A.B.C"); var configurations = provider.GetLoggerConfigurations(); var tierOneNamespace = configurations.First(n => n.Name == "A"); // assert I: base namespace is in the response, correctly Assert.Equal(LogLevel.Information, tierOneNamespace.EffectiveLevel); configurations = provider.GetLoggerConfigurations(); // act II: set A.B* to log at Trace provider.SetLogLevel("A.B", LogLevel.Trace); configurations = provider.GetLoggerConfigurations(); tierOneNamespace = configurations.First(n => n.Name == "A"); var tierTwoNamespace = configurations.First(n => n.Name == "A.B"); // assert II: base hasn't changed but the one set at runtime and all descendants (including a concrete logger) have Assert.Equal(LogLevel.Information, tierOneNamespace.EffectiveLevel); Assert.Equal(LogLevel.Trace, tierTwoNamespace.EffectiveLevel); Assert.True(childLogger.IsEnabled(LogLevel.Trace)); // act III: set A to something else, make sure it inherits down provider.SetLogLevel("A", LogLevel.Error); configurations = provider.GetLoggerConfigurations(); tierOneNamespace = configurations.First(n => n.Name == "A"); tierTwoNamespace = configurations.First(n => n.Name == "A.B"); var grandchildLogger = provider.CreateLogger("A.B.C.D"); // assert again Assert.Equal(LogLevel.Error, tierOneNamespace.EffectiveLevel); Assert.Equal(LogLevel.Error, tierTwoNamespace.EffectiveLevel); Assert.False(childLogger.IsEnabled(LogLevel.Warning)); Assert.False(grandchildLogger.IsEnabled(LogLevel.Warning)); }
public void SetLogLevel_UpdatesNamespaceDescendants() { // arrange (A* should log at Information) var provider = new SerilogDynamicProvider(GetConfiguration()); // act I: with original setup var childLogger = provider.CreateLogger("A.B.C"); var configurations = provider.GetLoggerConfigurations(); var tierOneNamespace = configurations.First(n => n.Name == "A"); // assert I: base namespace is in the response, correctly Assert.Equal(LogLevel.Information, tierOneNamespace.EffectiveLevel); configurations = provider.GetLoggerConfigurations(); // act II: set A.B* to log at Trace provider.SetLogLevel("A.B", LogLevel.Trace); configurations = provider.GetLoggerConfigurations(); tierOneNamespace = configurations.First(n => n.Name == "A"); var tierTwoNamespace = configurations.First(n => n.Name == "A.B"); // assert II: since Serilog doesnt expose filters, we can only change at the granularity of configured filters Assert.Equal(LogLevel.Trace, tierOneNamespace.EffectiveLevel); Assert.Equal(LogLevel.Trace, tierTwoNamespace.EffectiveLevel); Assert.True(childLogger.IsEnabled(LogLevel.Trace)); // act III: set A to something else, make sure it inherits down provider.SetLogLevel("A", LogLevel.Error); configurations = provider.GetLoggerConfigurations(); tierOneNamespace = configurations.First(n => n.Name == "A"); tierTwoNamespace = configurations.First(n => n.Name == "A.B"); var grandchildLogger = provider.CreateLogger("A.B.C.D"); // assert again Assert.Equal(LogLevel.Error, tierOneNamespace.EffectiveLevel); Assert.Equal(LogLevel.Error, tierTwoNamespace.EffectiveLevel); Assert.False(childLogger.IsEnabled(LogLevel.Warning)); Assert.False(grandchildLogger.IsEnabled(LogLevel.Debug)); }
public void SetLogLevel_Can_Reset_to_Default() { // arrange (A* should log at Information) var provider = new SerilogDynamicProvider(GetConfiguration()); // act I: with original setup var firstLogger = provider.CreateLogger("A.B.C"); var configurations = provider.GetLoggerConfigurations(); var tierOneNamespace = configurations.First(n => n.Name == "A"); // assert I: base namespace is in the response, correctly Assert.Equal(LogLevel.Information, tierOneNamespace.EffectiveLevel); // act II: set A.B* to log at Trace provider.SetLogLevel("A.B", LogLevel.Trace); configurations = provider.GetLoggerConfigurations(); tierOneNamespace = configurations.First(n => n.Name == "A"); var tierTwoNamespace = configurations.First(n => n.Name == "A.B"); // assert II: base hasn't changed but the one set at runtime and all descendants (including a concrete logger) have Assert.Equal(LogLevel.Information, tierOneNamespace.EffectiveLevel); Assert.Equal(LogLevel.Trace, tierTwoNamespace.EffectiveLevel); Assert.True(firstLogger.IsEnabled(LogLevel.Trace)); // act III: reset A.B provider.SetLogLevel("A.B", null); configurations = provider.GetLoggerConfigurations(); tierOneNamespace = configurations.First(n => n.Name == "A"); tierTwoNamespace = configurations.First(n => n.Name == "A.B"); var secondLogger = provider.CreateLogger("A.B.C.D"); // assert again Assert.Equal(LogLevel.Information, tierOneNamespace.EffectiveLevel); Assert.Equal(LogLevel.Information, tierTwoNamespace.EffectiveLevel); Assert.True(firstLogger.IsEnabled(LogLevel.Information)); Assert.True(secondLogger.IsEnabled(LogLevel.Information)); }
public void SetLogLevel_Can_Reset_to_Default() { // arrange (A* should log at Information) var provider = new SerilogDynamicProvider(GetConfiguration()); // act I: with original setup var firstLogger = provider.CreateLogger("A.B.C"); var configurations = provider.GetLoggerConfigurations(); var tierOneNamespace = configurations.First(n => n.Name == "A"); // assert I: base namespace is in the response, correctly Assert.Equal(LogLevel.Information, tierOneNamespace.EffectiveLevel); // act II: set A.B* to log at Trace provider.SetLogLevel("A.B", LogLevel.Trace); configurations = provider.GetLoggerConfigurations(); tierOneNamespace = configurations.First(n => n.Name == "A"); var tierTwoNamespace = configurations.First(n => n.Name == "A.B"); // assert II: since Serilog doesnt expose filters, we can only change at the granularity of configured overrides Assert.Equal(LogLevel.Trace, tierOneNamespace.EffectiveLevel); Assert.Equal(LogLevel.Trace, tierTwoNamespace.EffectiveLevel); Assert.True(firstLogger.IsEnabled(LogLevel.Trace)); // act III: reset A.B provider.SetLogLevel("A.B", null); configurations = provider.GetLoggerConfigurations(); tierOneNamespace = configurations.First(n => n.Name == "A"); tierTwoNamespace = configurations.First(n => n.Name == "A.B"); var secondLogger = provider.CreateLogger("A.B.C.D"); // assert again Assert.Equal(LogLevel.Information, tierOneNamespace.EffectiveLevel); Assert.Equal(LogLevel.Information, tierTwoNamespace.EffectiveLevel); Assert.True(firstLogger.IsEnabled(LogLevel.Information)); Assert.True(secondLogger.IsEnabled(LogLevel.Information)); }
public void GetLoggerConfigurations_ReturnsExpected() { var provider = new SerilogDynamicProvider(GetConfiguration()); LoggerFactory fac = new LoggerFactory(); fac.AddProvider(provider); ILogger logger = fac.CreateLogger(typeof(A.B.C.D.TestClass)); var logConfig = provider.GetLoggerConfigurations(); Assert.Equal(6, logConfig.Count); Assert.Contains(new DynamicLoggerConfiguration("Default", LogLevel.Trace, LogLevel.Trace), logConfig); Assert.Contains(new DynamicLoggerConfiguration("A.B.C.D.TestClass", null, LogLevel.Information), logConfig); Assert.Contains(new DynamicLoggerConfiguration("A.B.C.D", null, LogLevel.Information), logConfig); Assert.Contains(new DynamicLoggerConfiguration("A.B.C", LogLevel.Information, LogLevel.Information), logConfig); Assert.Contains(new DynamicLoggerConfiguration("A.B", null, LogLevel.Information), logConfig); Assert.Contains(new DynamicLoggerConfiguration("A", LogLevel.Information, LogLevel.Information), logConfig); }
public void LoggerLogs_At_Configured_Setting() { // arrange var provider = new SerilogDynamicProvider(GetConfiguration()); LoggerFactory fac = new LoggerFactory(); fac.AddProvider(provider); ILogger logger = fac.CreateLogger(typeof(A.B.C.D.TestClass)); // act I - log at all levels, expect Info and above to work using (var unConsole = new ConsoleOutputBorrower()) { WriteLogEntries(logger); // pause the thread to allow the logging to happen Thread.Sleep(100); var logged = unConsole.ToString(); // assert I Assert.Contains("Critical message", logged); Assert.Contains("Error message", logged); Assert.Contains("Warning message", logged); Assert.Contains("Informational message", logged); Assert.DoesNotContain("Debug message", logged); Assert.DoesNotContain("Trace message", logged); } // act II - adjust rules, expect Error and above to work provider.SetLogLevel("A.B.C.D", LogLevel.Error); using (var unConsole = new ConsoleOutputBorrower()) { WriteLogEntries(logger); // pause the thread to allow the logging to happen Thread.Sleep(100); var logged2 = unConsole.ToString(); // assert II Assert.Contains("Critical message", logged2); Assert.Contains("Error message", logged2); Assert.DoesNotContain("Warning message", logged2); Assert.DoesNotContain("Informational message", logged2); Assert.DoesNotContain("Debug message", logged2); Assert.DoesNotContain("Trace message", logged2); } // act III - adjust rules, expect Trace and above to work provider.SetLogLevel("A", LogLevel.Trace); using (var unConsole = new ConsoleOutputBorrower()) { WriteLogEntries(logger); // pause the thread to allow the logging to happen Thread.Sleep(100); var logged3 = unConsole.ToString(); // assert III Assert.Contains("Critical message", logged3); Assert.Contains("Error message", logged3); Assert.Contains("Warning message", logged3); Assert.Contains("Informational message", logged3); Assert.Contains("Debug message", logged3); Assert.Contains("Trace message", logged3); } // act IV - adjust rules, expect nothing to work provider.SetLogLevel("A", LogLevel.None); using (var unConsole = new ConsoleOutputBorrower()) { WriteLogEntries(logger); // pause the thread to allow the logging to happen Thread.Sleep(100); var logged4 = unConsole.ToString(); // assert IV Assert.Contains("Critical message", logged4); // Serilog lowest level is Fatal == Critical Assert.DoesNotContain("Error message", logged4); Assert.DoesNotContain("Warning message", logged4); Assert.DoesNotContain("Informational message", logged4); Assert.DoesNotContain("Debug message", logged4); Assert.DoesNotContain("Trace message", logged4); } // act V - reset the rules, expect Info and above to work provider.SetLogLevel("A", LogLevel.Information); // Only works with serilog for configured values using (var unConsole = new ConsoleOutputBorrower()) { WriteLogEntries(logger); // pause the thread to allow the logging to happen Thread.Sleep(100); var logged5 = unConsole.ToString(); // assert V Assert.NotNull(provider.GetLoggerConfigurations().First(c => c.Name == "A")); Assert.Contains("Critical message", logged5); Assert.Contains("Error message", logged5); Assert.Contains("Warning message", logged5); Assert.Contains("Informational message", logged5); Assert.DoesNotContain("Debug message", logged5); Assert.DoesNotContain("Trace message", logged5); } }