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

Commit af9377a

Browse files
authored
EventLog Scopes (#741)
1 parent 8f205be commit af9377a

File tree

3 files changed

+53
-3
lines changed

3 files changed

+53
-3
lines changed

src/Microsoft.Extensions.Logging.EventLog/EventLogLogger.cs

+19-2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ public class EventLogLogger : ILogger
1515
{
1616
private readonly string _name;
1717
private readonly EventLogSettings _settings;
18+
private readonly IExternalScopeProvider _externalScopeProvider;
19+
1820
private const string ContinuationString = "...";
1921
private readonly int _beginOrEndMessageSegmentSize;
2022
private readonly int _intermediateMessageSegmentSize;
@@ -34,9 +36,22 @@ public EventLogLogger(string name)
3436
/// <param name="name">The name of the logger.</param>
3537
/// <param name="settings">The <see cref="EventLogSettings"/>.</param>
3638
public EventLogLogger(string name, EventLogSettings settings)
39+
: this(name, settings, new LoggerExternalScopeProvider())
40+
{
41+
42+
}
43+
44+
/// <summary>
45+
/// Initializes a new instance of the <see cref="EventLogLogger"/> class.
46+
/// </summary>
47+
/// <param name="name">The name of the logger.</param>
48+
/// <param name="settings">The <see cref="EventLogSettings"/>.</param>
49+
/// <param name="externalScopeProvider">The <see cref="IExternalScopeProvider"/>.</param>
50+
public EventLogLogger(string name, EventLogSettings settings, IExternalScopeProvider externalScopeProvider)
3751
{
3852
_name = string.IsNullOrEmpty(name) ? nameof(EventLogLogger) : name;
3953
_settings = settings;
54+
_externalScopeProvider = externalScopeProvider;
4055

4156
var logName = string.IsNullOrEmpty(settings.LogName) ? "Application" : settings.LogName;
4257
var sourceName = string.IsNullOrEmpty(settings.SourceName) ? "Application" : settings.SourceName;
@@ -63,7 +78,7 @@ public EventLogLogger(string name, EventLogSettings settings)
6378
/// <inheritdoc />
6479
public IDisposable BeginScope<TState>(TState state)
6580
{
66-
return NoopDisposable.Instance;
81+
return _externalScopeProvider?.Push(state);
6782
}
6883

6984
/// <inheritdoc />
@@ -102,9 +117,11 @@ public void Log<TState>(
102117

103118
if (exception != null)
104119
{
105-
message += Environment.NewLine + Environment.NewLine + exception.ToString();
120+
message += Environment.NewLine + Environment.NewLine + exception;
106121
}
107122

123+
_externalScopeProvider?.ForEachScope<object>((scope, _) => message += Environment.NewLine + scope, null);
124+
108125
WriteMessage(message, GetEventLogEntryType(logLevel), eventId.Id);
109126
}
110127

src/Microsoft.Extensions.Logging.EventLog/EventLogLoggerProvider.cs

+8-1
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@ namespace Microsoft.Extensions.Logging.EventLog
99
/// The provider for the <see cref="EventLogLogger"/>.
1010
/// </summary>
1111
[ProviderAlias("EventLog")]
12-
public class EventLogLoggerProvider : ILoggerProvider
12+
public class EventLogLoggerProvider : ILoggerProvider, ISupportExternalScope
1313
{
1414
private readonly EventLogSettings _settings;
1515

16+
private IExternalScopeProvider _scopeProvider;
17+
1618
/// <summary>
1719
/// Initializes a new instance of the <see cref="EventLogLoggerProvider"/> class.
1820
/// </summary>
@@ -39,5 +41,10 @@ public ILogger CreateLogger(string name)
3941
public void Dispose()
4042
{
4143
}
44+
45+
public void SetScopeProvider(IExternalScopeProvider scopeProvider)
46+
{
47+
_scopeProvider = scopeProvider;
48+
}
4249
}
4350
}

test/Microsoft.Extensions.Logging.Test/EventLogLoggerTest.cs

+26
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,32 @@ public void MessageWithinMaxSize_WritesFullMessage(int messageSize)
120120
Assert.Equal(expectedMessage, testEventLog.Messages[0]);
121121
}
122122

123+
124+
[Fact]
125+
public void Message_WritesFullMessageWithScopes()
126+
{
127+
// Arrange
128+
var loggerName = "Test";
129+
var maxMessageSize = 50 + loggerName.Length + Environment.NewLine.Length;
130+
var expectedMessage = loggerName + Environment.NewLine +
131+
"Message" + Environment.NewLine +
132+
"Outer Scope" + Environment.NewLine +
133+
"Inner Scope";
134+
var testEventLog = new TestEventLog(maxMessageSize);
135+
var logger = new EventLogLogger(loggerName, new EventLogSettings() { EventLog = testEventLog });
136+
137+
// Act
138+
using (logger.BeginScope("Outer Scope"))
139+
using (logger.BeginScope("Inner Scope"))
140+
{
141+
logger.LogInformation("Message");
142+
}
143+
144+
// Assert
145+
Assert.Single(testEventLog.Messages);
146+
Assert.Equal(expectedMessage, testEventLog.Messages[0]);
147+
}
148+
123149
public static TheoryData<int, string[]> WritesSplitMessagesData
124150
{
125151
get

0 commit comments

Comments
 (0)