From 62265c0b3982e9fa17d49fd6f699ee84d35cc566 Mon Sep 17 00:00:00 2001 From: BrennanConroy Date: Thu, 21 Jul 2016 15:39:16 -0700 Subject: [PATCH] Fix EventLogger in .NET 4.5.2 --- .../EventSourceLogger.cs | 17 +++++++++++++- .../EventSourceLoggerProvider.cs | 3 +++ .../LoggingEventSource.cs | 23 +++++++++++++++++-- .../EventSourceLoggerTest.cs | 2 +- 4 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.Extensions.Logging.EventSource/EventSourceLogger.cs b/src/Microsoft.Extensions.Logging.EventSource/EventSourceLogger.cs index 88ee509e..c656d7fc 100644 --- a/src/Microsoft.Extensions.Logging.EventSource/EventSourceLogger.cs +++ b/src/Microsoft.Extensions.Logging.EventSource/EventSourceLogger.cs @@ -37,7 +37,22 @@ public EventSourceLogger(string categoryName, int factoryID, LoggingEventSource public string CategoryName { get; } - public LogLevel Level { get; set; } + private LogLevel _level; + + public LogLevel Level + { + get + { + // need to check if the filter spec and internal event source level has changed + // and update the loggers level if it has + _eventSource.ApplyFilterSpec(); + return _level; + } + set + { + _level = value; + } + } // Loggers created by a single provider form a linked list public EventSourceLogger Next { get; } diff --git a/src/Microsoft.Extensions.Logging.EventSource/EventSourceLoggerProvider.cs b/src/Microsoft.Extensions.Logging.EventSource/EventSourceLoggerProvider.cs index 13199ed5..e795b535 100644 --- a/src/Microsoft.Extensions.Logging.EventSource/EventSourceLoggerProvider.cs +++ b/src/Microsoft.Extensions.Logging.EventSource/EventSourceLoggerProvider.cs @@ -37,6 +37,9 @@ public EventSourceLoggerProvider(LoggingEventSource eventSource, EventSourceLogg /// public ILogger CreateLogger(string categoryName) { + // need to check if the filter spec and internal event source level has changed + // and update the _defaultLevel if it has + _eventSource.ApplyFilterSpec(); var newLogger = _loggers = new EventSourceLogger(categoryName, _factoryID, _eventSource, _loggers); newLogger.Level = ParseLevelSpecs(_filterSpec, _defaultLevel, newLogger.CategoryName); return newLogger; diff --git a/src/Microsoft.Extensions.Logging.EventSource/LoggingEventSource.cs b/src/Microsoft.Extensions.Logging.EventSource/LoggingEventSource.cs index 984879e0..ed2f1832 100644 --- a/src/Microsoft.Extensions.Logging.EventSource/LoggingEventSource.cs +++ b/src/Microsoft.Extensions.Logging.EventSource/LoggingEventSource.cs @@ -106,6 +106,7 @@ public class Keywords private string _filterSpec; private EventSourceLoggerProvider _loggingProviders; private object _lockObj = new object(); + private bool _checkLevel; internal EventSourceLoggerProvider CreateLoggerProvider() { @@ -226,9 +227,27 @@ protected override void OnEventCommand(EventCommandEventArgs command) private void SetFilterSpec(string filterSpec) { _filterSpec = filterSpec; - for (var cur = _loggingProviders; cur != null; cur = cur.Next) + + // In .NET 4.5.2 the internal EventSource level hasn't been correctly set + // when this callback is invoked. To still have the logger behave correctly + // in .NET 4.5.2 we delay checking the level until the logger is used the first + // time after this callback. + _checkLevel = true; + } + + [NonEvent] + internal void ApplyFilterSpec() + { + lock (_lockObj) { - cur.SetFilterSpec(filterSpec); + if (_checkLevel) + { + for (var cur = _loggingProviders; cur != null; cur = cur.Next) + { + cur.SetFilterSpec(_filterSpec); + } + _checkLevel = false; + } } } } diff --git a/test/Microsoft.Extensions.Logging.EventSource.Test/EventSourceLoggerTest.cs b/test/Microsoft.Extensions.Logging.EventSource.Test/EventSourceLoggerTest.cs index c892eebe..492ec832 100644 --- a/test/Microsoft.Extensions.Logging.EventSource.Test/EventSourceLoggerTest.cs +++ b/test/Microsoft.Extensions.Logging.EventSource.Test/EventSourceLoggerTest.cs @@ -23,7 +23,7 @@ public void Logs_AsExpected_WithDefaults() factory.AddEventSourceLogger(); var listenerSettings = new TestEventListener.ListenerSettings(); - listenerSettings.Keywords = EventKeywords.None; + listenerSettings.Keywords = (EventKeywords)(-1); listenerSettings.FilterSpec = null; listenerSettings.Level = default(EventLevel); testListener.EnableEvents(listenerSettings);