Skip to content
This repository was archived by the owner on Dec 13, 2018. It is now read-only.

Commit 62265c0

Browse files
committed
Fix EventLogger in .NET 4.5.2
1 parent 61a625a commit 62265c0

File tree

4 files changed

+41
-4
lines changed

4 files changed

+41
-4
lines changed

src/Microsoft.Extensions.Logging.EventSource/EventSourceLogger.cs

+16-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,22 @@ public EventSourceLogger(string categoryName, int factoryID, LoggingEventSource
3737

3838
public string CategoryName { get; }
3939

40-
public LogLevel Level { get; set; }
40+
private LogLevel _level;
41+
42+
public LogLevel Level
43+
{
44+
get
45+
{
46+
// need to check if the filter spec and internal event source level has changed
47+
// and update the loggers level if it has
48+
_eventSource.ApplyFilterSpec();
49+
return _level;
50+
}
51+
set
52+
{
53+
_level = value;
54+
}
55+
}
4156

4257
// Loggers created by a single provider form a linked list
4358
public EventSourceLogger Next { get; }

src/Microsoft.Extensions.Logging.EventSource/EventSourceLoggerProvider.cs

+3
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ public EventSourceLoggerProvider(LoggingEventSource eventSource, EventSourceLogg
3737
/// </summary>
3838
public ILogger CreateLogger(string categoryName)
3939
{
40+
// need to check if the filter spec and internal event source level has changed
41+
// and update the _defaultLevel if it has
42+
_eventSource.ApplyFilterSpec();
4043
var newLogger = _loggers = new EventSourceLogger(categoryName, _factoryID, _eventSource, _loggers);
4144
newLogger.Level = ParseLevelSpecs(_filterSpec, _defaultLevel, newLogger.CategoryName);
4245
return newLogger;

src/Microsoft.Extensions.Logging.EventSource/LoggingEventSource.cs

+21-2
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ public class Keywords
106106
private string _filterSpec;
107107
private EventSourceLoggerProvider _loggingProviders;
108108
private object _lockObj = new object();
109+
private bool _checkLevel;
109110

110111
internal EventSourceLoggerProvider CreateLoggerProvider()
111112
{
@@ -226,9 +227,27 @@ protected override void OnEventCommand(EventCommandEventArgs command)
226227
private void SetFilterSpec(string filterSpec)
227228
{
228229
_filterSpec = filterSpec;
229-
for (var cur = _loggingProviders; cur != null; cur = cur.Next)
230+
231+
// In .NET 4.5.2 the internal EventSource level hasn't been correctly set
232+
// when this callback is invoked. To still have the logger behave correctly
233+
// in .NET 4.5.2 we delay checking the level until the logger is used the first
234+
// time after this callback.
235+
_checkLevel = true;
236+
}
237+
238+
[NonEvent]
239+
internal void ApplyFilterSpec()
240+
{
241+
lock (_lockObj)
230242
{
231-
cur.SetFilterSpec(filterSpec);
243+
if (_checkLevel)
244+
{
245+
for (var cur = _loggingProviders; cur != null; cur = cur.Next)
246+
{
247+
cur.SetFilterSpec(_filterSpec);
248+
}
249+
_checkLevel = false;
250+
}
232251
}
233252
}
234253
}

test/Microsoft.Extensions.Logging.EventSource.Test/EventSourceLoggerTest.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public void Logs_AsExpected_WithDefaults()
2323
factory.AddEventSourceLogger();
2424

2525
var listenerSettings = new TestEventListener.ListenerSettings();
26-
listenerSettings.Keywords = EventKeywords.None;
26+
listenerSettings.Keywords = (EventKeywords)(-1);
2727
listenerSettings.FilterSpec = null;
2828
listenerSettings.Level = default(EventLevel);
2929
testListener.EnableEvents(listenerSettings);

0 commit comments

Comments
 (0)