Skip to content

Commit 1530e04

Browse files
authored
Merge pull request #227 from nblumhardt/sp-tr
Capture trace and span ids for Serilog 3.1
2 parents b524ab6 + 3f1ccda commit 1530e04

File tree

5 files changed

+52
-12
lines changed

5 files changed

+52
-12
lines changed

src/Serilog.Extensions.Logging/Extensions/Logging/SerilogLogger.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using System.Reflection;
99
using Serilog.Debugging;
1010
using System.Collections.Concurrent;
11+
using System.Diagnostics;
1112

1213
namespace Serilog.Extensions.Logging;
1314

@@ -156,8 +157,12 @@ LogEvent PrepareWrite<TState>(LogEventLevel level, EventId eventId, TState state
156157
if (eventId.Id != 0 || eventId.Name != null)
157158
properties.Add(CreateEventIdProperty(eventId));
158159

160+
var (traceId, spanId) = Activity.Current is { } activity ?
161+
(activity.TraceId, activity.SpanId) :
162+
(default(ActivityTraceId), default(ActivitySpanId));
163+
159164
var parsedTemplate = MessageTemplateParser.Parse(messageTemplate ?? "");
160-
return new LogEvent(DateTimeOffset.Now, level, exception, parsedTemplate, properties);
165+
return new LogEvent(DateTimeOffset.Now, level, exception, parsedTemplate, properties, traceId, spanId);
161166
}
162167

163168
static object? AsLoggableValue<TState>(TState state, Func<TState, Exception?, string>? formatter)

src/Serilog.Extensions.Logging/Serilog.Extensions.Logging.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
<None Include="..\..\assets\serilog-extension-nuget.png" Pack="true" PackagePath="" Visible="false" />
3030
<None Include="..\..\README.md" Pack="true" PackagePath="\" Visible="false" />
3131
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.1.1" PrivateAssets="All" />
32-
<PackageReference Include="Serilog" Version="2.12.0" />
32+
<PackageReference Include="Serilog" Version="3.1.0-*" />
3333
<!-- The version of this reference must match the major and minor components of the package version prefix. -->
3434
<PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0" />
3535
<PackageReference Include="Nullable" Version="1.3.1" PrivateAssets="All" />

test/Serilog.Extensions.Logging.Benchmarks/Serilog.Extensions.Logging.Benchmarks.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<ItemGroup>
1313
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
1414
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5" PrivateAssets="All" />
15-
<PackageReference Include="xunit" Version="2.4.2" />
15+
<PackageReference Include="xunit" Version="2.5.1" />
1616
<PackageReference Include="BenchmarkDotNet" Version="0.13.5" />
1717
</ItemGroup>
1818

test/Serilog.Extensions.Logging.Tests/Serilog.Extensions.Logging.Tests.csproj

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
<TargetFrameworks>net7.0;net472</TargetFrameworks>
55
<ImplicitUsings>enable</ImplicitUsings>
66
</PropertyGroup>
7+
8+
<PropertyGroup Condition=" '$(TargetFramework)' == 'net472' ">
9+
<DefineConstants>$(DefineConstants);FORCE_W3C_ACTIVITY_ID</DefineConstants>
10+
</PropertyGroup>
711

812
<ItemGroup>
913
<ProjectReference Include="..\..\src\Serilog.Extensions.Logging\Serilog.Extensions.Logging.csproj" />
@@ -12,7 +16,7 @@
1216
<ItemGroup>
1317
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
1418
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5" PrivateAssets="all" />
15-
<PackageReference Include="xunit" Version="2.4.2" />
19+
<PackageReference Include="xunit" Version="2.5.1" />
1620
<PackageReference Include="Shouldly" Version="4.1.0" />
1721
<PackageReference Include="PublicApiGenerator" Version="11.0.0" />
1822
</ItemGroup>

test/Serilog.Extensions.Logging.Tests/SerilogLoggerTests.cs

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

44
using System.Collections;
5+
using System.Diagnostics;
56
using Serilog.Events;
67
using Microsoft.Extensions.Logging;
78
using Serilog.Debugging;
@@ -138,11 +139,11 @@ public void LogsCorrectMessage()
138139

139140
logger.Log<object>(LogLevel.Information, 0, null!, null!, null!);
140141
logger.Log(LogLevel.Information, 0, TestMessage, null!, null!);
141-
logger.Log<object>(LogLevel.Information, 0, null!, null!, (_, __) => TestMessage);
142+
logger.Log<object>(LogLevel.Information, 0, null!, null!, (_, _) => TestMessage);
142143

143144
Assert.Equal(3, sink.Writes.Count);
144145

145-
Assert.Equal(1, sink.Writes[0].Properties.Count);
146+
Assert.Single(sink.Writes[0].Properties);
146147
Assert.Empty(sink.Writes[0].RenderMessage());
147148

148149
Assert.Equal(2, sink.Writes[1].Properties.Count);
@@ -308,7 +309,7 @@ public void WhenDisposeIsTrueProvidedLoggerIsDisposed()
308309
}
309310

310311
[Fact]
311-
public void BeginScopeDestructuresObjectsWhenDestructurerIsUsedInMessageTemplate()
312+
public void BeginScopeDestructuresObjectsWhenCapturingOperatorIsUsedInMessageTemplate()
312313
{
313314
var (logger, sink) = SetUp(LogLevel.Trace);
314315

@@ -328,7 +329,7 @@ public void BeginScopeDestructuresObjectsWhenDestructurerIsUsedInMessageTemplate
328329
}
329330

330331
[Fact]
331-
public void BeginScopeDestructuresObjectsWhenDestructurerIsUsedInDictionary()
332+
public void BeginScopeDestructuresObjectsWhenCapturingOperatorIsUsedInDictionary()
332333
{
333334
var (logger, sink) = SetUp(LogLevel.Trace);
334335

@@ -348,7 +349,7 @@ public void BeginScopeDestructuresObjectsWhenDestructurerIsUsedInDictionary()
348349
}
349350

350351
[Fact]
351-
public void BeginScopeDoesNotModifyKeyWhenDestructurerIsNotUsedInMessageTemplate()
352+
public void BeginScopeDoesNotModifyKeyWhenCapturingOperatorIsNotUsedInMessageTemplate()
352353
{
353354
var (logger, sink) = SetUp(LogLevel.Trace);
354355

@@ -362,7 +363,7 @@ public void BeginScopeDoesNotModifyKeyWhenDestructurerIsNotUsedInMessageTemplate
362363
}
363364

364365
[Fact]
365-
public void BeginScopeDoesNotModifyKeyWhenDestructurerIsNotUsedInDictionary()
366+
public void BeginScopeDoesNotModifyKeyWhenCapturingOperatorIsNotUsedInDictionary()
366367
{
367368
var (logger, sink) = SetUp(LogLevel.Trace);
368369

@@ -466,7 +467,10 @@ public void MismatchedMessageTemplateParameterCountIsHandled()
466467
{
467468
var (logger, sink) = SetUp(LogLevel.Trace);
468469

470+
#pragma warning disable CA2017
471+
// ReSharper disable once StructuredMessageTemplateProblem
469472
logger.LogInformation("Some test message with {Two} {Properties}", "OneProperty");
473+
#pragma warning restore CA2017
470474

471475
Assert.Empty(sink.Writes);
472476
}
@@ -475,7 +479,7 @@ public void MismatchedMessageTemplateParameterCountIsHandled()
475479
public void ExceptionFromAuditSinkIsUnhandled()
476480
{
477481
var serilogLogger = new LoggerConfiguration()
478-
.AuditTo.Sink(new MySink())
482+
.AuditTo.Sink(new UnimplementedSink())
479483
.CreateLogger();
480484

481485
var provider = new SerilogLoggerProvider(serilogLogger);
@@ -486,11 +490,38 @@ public void ExceptionFromAuditSinkIsUnhandled()
486490
Assert.Equal("Oops", ex.InnerException.Message);
487491
}
488492

489-
private class MySink : ILogEventSink
493+
class UnimplementedSink : ILogEventSink
490494
{
491495
public void Emit(LogEvent logEvent)
492496
{
493497
throw new NotImplementedException("Oops");
494498
}
495499
}
500+
501+
[Fact]
502+
public void TraceAndSpanIdsAreCaptured()
503+
{
504+
#if FORCE_W3C_ACTIVITY_ID
505+
Activity.DefaultIdFormat = ActivityIdFormat.W3C;
506+
Activity.ForceDefaultIdFormat = true;
507+
#endif
508+
509+
using var listener = new ActivityListener();
510+
listener.ShouldListenTo = _ => true;
511+
listener.Sample = (ref ActivityCreationOptions<ActivityContext> _) => ActivitySamplingResult.AllData;
512+
513+
ActivitySource.AddActivityListener(listener);
514+
515+
var source = new ActivitySource("test.activity", "1.0.0");
516+
using var activity = source.StartActivity();
517+
Assert.NotNull(Activity.Current);
518+
519+
var (logger, sink) = SetUp(LogLevel.Trace);
520+
logger.LogInformation("Hello trace and span!");
521+
522+
var evt = Assert.Single(sink.Writes);
523+
524+
Assert.Equal(Activity.Current.TraceId, evt.TraceId);
525+
Assert.Equal(Activity.Current.SpanId, evt.SpanId);
526+
}
496527
}

0 commit comments

Comments
 (0)