Skip to content

Commit 09ab33c

Browse files
authored
Merge pull request #189 from david-driscoll/feature/event-id-fix
Added EventId to LoggerProviderCollectionSink
2 parents 50b7228 + a3139b8 commit 09ab33c

File tree

3 files changed

+145
-1
lines changed

3 files changed

+145
-1
lines changed

src/Serilog.Extensions.Logging/Extensions/Logging/LoggerProviderCollectionSink.cs

+15-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
// limitations under the License.
1414

1515
using System;
16+
using Microsoft.Extensions.Logging;
1617
using Serilog.Core;
1718
using Serilog.Events;
1819

@@ -30,13 +31,26 @@ public LoggerProviderCollectionSink(LoggerProviderCollection providers)
3031
public void Emit(LogEvent logEvent)
3132
{
3233
string categoryName = null;
34+
EventId eventId = default;
3335

3436
if (logEvent.Properties.TryGetValue("SourceContext", out var sourceContextProperty) &&
3537
sourceContextProperty is ScalarValue sourceContextValue &&
3638
sourceContextValue.Value is string sourceContext)
3739
{
3840
categoryName = sourceContext;
3941
}
42+
if (logEvent.Properties.TryGetValue("EventId", out var eventIdPropertyValue) && eventIdPropertyValue is StructureValue structuredEventId)
43+
{
44+
string name = null;
45+
var id = 0;
46+
foreach (var item in structuredEventId.Properties)
47+
{
48+
if (item.Name == "Id" && item.Value is ScalarValue sv && sv.Value is int i) id = i;
49+
if (item.Name == "Name" && item.Value is ScalarValue sv2 && sv2.Value is string s) name = s;
50+
}
51+
52+
eventId = new EventId(id, name);
53+
}
4054

4155
var level = LevelConvert.ToExtensionsLevel(logEvent.Level);
4256
var slv = new SerilogLogValues(logEvent.MessageTemplate, logEvent.Properties);
@@ -47,7 +61,7 @@ sourceContextProperty is ScalarValue sourceContextValue &&
4761

4862
logger.Log(
4963
level,
50-
default,
64+
eventId,
5165
slv,
5266
logEvent.Exception,
5367
(s, e) => s.ToString());
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System;
5+
using Microsoft.Extensions.Logging;
6+
using Serilog.Extensions.Logging.Tests.Support;
7+
using Xunit;
8+
9+
namespace Serilog.Extensions.Logging.Tests
10+
{
11+
public class LoggerProviderCollectionSinkTests
12+
{
13+
const string Name = "test";
14+
const string TestMessage = "This is a test";
15+
16+
static Tuple<SerilogLogger, ExtensionsProvider> SetUp(LogLevel logLevel)
17+
{
18+
var providers = new LoggerProviderCollection();
19+
var provider = new ExtensionsProvider(logLevel);
20+
providers.AddProvider(provider);
21+
var serilogLogger = new LoggerConfiguration()
22+
.WriteTo.Providers(providers)
23+
.MinimumLevel.Is(LevelConvert.ToSerilogLevel(logLevel))
24+
.CreateLogger();
25+
26+
var logger = (SerilogLogger)new SerilogLoggerProvider(serilogLogger).CreateLogger(Name);
27+
28+
return new Tuple<SerilogLogger, ExtensionsProvider>(logger, provider);
29+
}
30+
31+
[Fact]
32+
public void LogsCorrectLevel()
33+
{
34+
var (logger, sink) = SetUp(LogLevel.Trace);
35+
36+
logger.Log(LogLevel.Trace, 0, TestMessage, null, null);
37+
logger.Log(LogLevel.Debug, 0, TestMessage, null, null);
38+
logger.Log(LogLevel.Information, 0, TestMessage, null, null);
39+
logger.Log(LogLevel.Warning, 0, TestMessage, null, null);
40+
logger.Log(LogLevel.Error, 0, TestMessage, null, null);
41+
logger.Log(LogLevel.Critical, 0, TestMessage, null, null);
42+
43+
Assert.Equal(6, sink.Writes.Count);
44+
Assert.Equal(LogLevel.Trace, sink.Writes[0].logLevel);
45+
Assert.Equal(LogLevel.Debug, sink.Writes[1].logLevel);
46+
Assert.Equal(LogLevel.Information, sink.Writes[2].logLevel);
47+
Assert.Equal(LogLevel.Warning, sink.Writes[3].logLevel);
48+
Assert.Equal(LogLevel.Error, sink.Writes[4].logLevel);
49+
Assert.Equal(LogLevel.Critical, sink.Writes[5].logLevel);
50+
}
51+
52+
[Fact]
53+
public void LogsCorrectEventId()
54+
{
55+
var (logger, sink) = SetUp(LogLevel.Trace);
56+
57+
logger.Log(LogLevel.Trace, new EventId(1, nameof(LogLevel.Trace)), TestMessage, null, null);
58+
logger.Log(LogLevel.Debug, new EventId(2, nameof(LogLevel.Debug)), TestMessage, null, null);
59+
logger.Log(LogLevel.Information, new EventId(3, nameof(LogLevel.Information)), TestMessage, null, null);
60+
logger.Log(LogLevel.Warning, new EventId(4, nameof(LogLevel.Warning)), TestMessage, null, null);
61+
logger.Log(LogLevel.Error, new EventId(5, nameof(LogLevel.Error)), TestMessage, null, null);
62+
logger.Log(LogLevel.Critical, new EventId(6, nameof(LogLevel.Critical)), TestMessage, null, null);
63+
64+
Assert.Equal(6, sink.Writes.Count);
65+
66+
Assert.Equal(1, sink.Writes[0].eventId.Id);
67+
Assert.Equal(nameof(LogLevel.Trace), sink.Writes[0].eventId.Name);
68+
69+
Assert.Equal(2, sink.Writes[1].eventId.Id);
70+
Assert.Equal(nameof(LogLevel.Debug), sink.Writes[1].eventId.Name);
71+
72+
Assert.Equal(3, sink.Writes[2].eventId.Id);
73+
Assert.Equal(nameof(LogLevel.Information), sink.Writes[2].eventId.Name);
74+
75+
Assert.Equal(4, sink.Writes[3].eventId.Id);
76+
Assert.Equal(nameof(LogLevel.Warning), sink.Writes[3].eventId.Name);
77+
78+
Assert.Equal(5, sink.Writes[4].eventId.Id);
79+
Assert.Equal(nameof(LogLevel.Error), sink.Writes[4].eventId.Name);
80+
81+
Assert.Equal(6, sink.Writes[5].eventId.Id);
82+
Assert.Equal(nameof(LogLevel.Critical), sink.Writes[5].eventId.Name);
83+
}
84+
}
85+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System;
5+
using System.Collections.Generic;
6+
using Microsoft.Extensions.Logging;
7+
using Serilog.Events;
8+
9+
namespace Serilog.Extensions.Logging.Tests.Support
10+
{
11+
public class ExtensionsProvider : ILoggerProvider, Microsoft.Extensions.Logging.ILogger
12+
{
13+
private readonly LogLevel enabledLevel;
14+
public List<(LogLevel logLevel, EventId eventId, object state, Exception exception, string message)> Writes { get; set; } = new List<(LogLevel logLevel, EventId eventId, object state, Exception exception, string message)>();
15+
16+
public ExtensionsProvider(LogLevel enabledLevel)
17+
{
18+
this.enabledLevel = enabledLevel;
19+
}
20+
21+
public Microsoft.Extensions.Logging.ILogger CreateLogger(string categoryName)
22+
{
23+
return this;
24+
}
25+
26+
public IDisposable BeginScope<TState>(TState state)
27+
{
28+
return this;
29+
}
30+
31+
public bool IsEnabled(LogLevel logLevel)
32+
{
33+
return enabledLevel <= logLevel;
34+
}
35+
36+
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
37+
{
38+
Writes.Add((logLevel, eventId, state, exception, formatter(state, exception)));
39+
}
40+
41+
public void Dispose()
42+
{
43+
}
44+
}
45+
}

0 commit comments

Comments
 (0)