Skip to content

Commit 2106676

Browse files
authored
Merge pull request #872 from leancodepl/fix/logs-sanitization
Fix ContextualLogger bypassing Serilog destructuring policies (v10)
2 parents a7d4fa2 + d4c1c28 commit 2106676

3 files changed

Lines changed: 60 additions & 0 deletions

File tree

src/Infrastructure/LeanCode.Logging/ContextualLogger.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
using System.Diagnostics.CodeAnalysis;
12
using Serilog;
23
using Serilog.Events;
4+
using Serilog.Parsing;
35

46
namespace LeanCode.Logging;
57

@@ -8,4 +10,11 @@ public class ContextualLogger<T>(ILogger logger) : ILogger<T>
810
private readonly ILogger logger = logger.ForContext<T>();
911

1012
public void Write(LogEvent logEvent) => logger.Write(logEvent);
13+
14+
public bool BindMessageTemplate(
15+
string messageTemplate,
16+
object?[]? propertyValues,
17+
[NotNullWhen(true)] out MessageTemplate? parsedTemplate,
18+
[NotNullWhen(true)] out IEnumerable<LogEventProperty>? boundProperties
19+
) => logger.BindMessageTemplate(messageTemplate, propertyValues, out parsedTemplate, out boundProperties);
1120
}

src/Infrastructure/LeanCode.Logging/NullLogger.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
using System.Diagnostics.CodeAnalysis;
12
using Serilog.Events;
3+
using Serilog.Parsing;
24

35
namespace LeanCode.Logging;
46

@@ -7,4 +9,16 @@ public class NullLogger<T> : ILogger<T>
79
public static readonly NullLogger<T> Instance = new();
810

911
public void Write(LogEvent logEvent) { }
12+
13+
public bool BindMessageTemplate(
14+
string messageTemplate,
15+
object?[]? propertyValues,
16+
[NotNullWhen(true)] out MessageTemplate? parsedTemplate,
17+
[NotNullWhen(true)] out IEnumerable<LogEventProperty>? boundProperties
18+
)
19+
{
20+
parsedTemplate = null;
21+
boundProperties = null;
22+
return false;
23+
}
1024
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using Serilog;
2+
using Serilog.Core;
3+
using Serilog.Events;
4+
using Xunit;
5+
6+
namespace LeanCode.Logging.Tests;
7+
8+
public class ContextualLoggerDestructuringTests
9+
{
10+
private sealed class DestructuringMarker { }
11+
12+
[Fact]
13+
public void ContextualLogger_applies_configured_destructuring_policies_to_message_templates()
14+
{
15+
var sink = new SingleLogEventCapturerSink();
16+
17+
using var log = new LoggerConfiguration().Destructure.With<RightSanitizer>().WriteTo.Sink(sink).CreateLogger();
18+
19+
Logging.ILogger<DestructuringMarker> contextualLogger = new ContextualLogger<DestructuringMarker>(log);
20+
21+
contextualLogger.Information("{@Payload}", Payload.Workable);
22+
23+
Assert.NotNull(sink.LastEvent);
24+
var prop = sink.LastEvent!.Properties["Payload"];
25+
var rendered = prop.ToString();
26+
27+
Assert.Contains(BaseSanitizer<Payload>.Placeholder, rendered, StringComparison.Ordinal);
28+
Assert.DoesNotContain("NOT PLACEHOLDER", rendered, StringComparison.Ordinal);
29+
}
30+
31+
private sealed class SingleLogEventCapturerSink : ILogEventSink
32+
{
33+
public LogEvent LastEvent { get; private set; } = null!;
34+
35+
public void Emit(LogEvent logEvent) => LastEvent = logEvent;
36+
}
37+
}

0 commit comments

Comments
 (0)