Skip to content

Commit 484987f

Browse files
authored
Merge pull request #218 from sungam3r/exception
Do not swallow exception from Audit
2 parents 8fd1fa4 + 6da75a2 commit 484987f

File tree

2 files changed

+37
-10
lines changed

2 files changed

+37
-10
lines changed

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

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -74,19 +74,23 @@ public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Except
7474
return;
7575
}
7676

77+
LogEvent? evt = null;
7778
try
7879
{
79-
Write(level, eventId, state, exception, formatter);
80+
evt = PrepareWrite(level, eventId, state, exception, formatter);
8081
}
8182
catch (Exception ex)
8283
{
8384
SelfLog.WriteLine($"Failed to write event through {typeof(SerilogLogger).Name}: {ex}");
8485
}
86+
87+
// Do not swallow exceptions from here because Serilog takes care of them in case of WriteTo and throws them back to the caller in case of AuditTo.
88+
if (evt != null)
89+
_logger.Write(evt);
8590
}
8691

87-
void Write<TState>(LogEventLevel level, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
92+
LogEvent PrepareWrite<TState>(LogEventLevel level, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
8893
{
89-
var logger = _logger;
9094
string? messageTemplate = null;
9195

9296
var properties = new List<LogEventProperty>();
@@ -101,17 +105,17 @@ void Write<TState>(LogEventLevel level, EventId eventId, TState state, Exception
101105
}
102106
else if (property.Key.StartsWith("@"))
103107
{
104-
if (logger.BindProperty(GetKeyWithoutFirstSymbol(DestructureDictionary, property.Key), property.Value, true, out var destructured))
108+
if (_logger.BindProperty(GetKeyWithoutFirstSymbol(DestructureDictionary, property.Key), property.Value, true, out var destructured))
105109
properties.Add(destructured);
106110
}
107111
else if (property.Key.StartsWith("$"))
108112
{
109-
if (logger.BindProperty(GetKeyWithoutFirstSymbol(StringifyDictionary, property.Key), property.Value?.ToString(), true, out var stringified))
113+
if (_logger.BindProperty(GetKeyWithoutFirstSymbol(StringifyDictionary, property.Key), property.Value?.ToString(), true, out var stringified))
110114
properties.Add(stringified);
111115
}
112116
else
113117
{
114-
if (logger.BindProperty(property.Key, property.Value, false, out var bound))
118+
if (_logger.BindProperty(property.Key, property.Value, false, out var bound))
115119
properties.Add(bound);
116120
}
117121
}
@@ -122,7 +126,7 @@ void Write<TState>(LogEventLevel level, EventId eventId, TState state, Exception
122126
if (messageTemplate == null && !stateTypeInfo.IsGenericType)
123127
{
124128
messageTemplate = "{" + stateType.Name + ":l}";
125-
if (logger.BindProperty(stateType.Name, AsLoggableValue(state, formatter), false, out var stateTypeProperty))
129+
if (_logger.BindProperty(stateType.Name, AsLoggableValue(state, formatter), false, out var stateTypeProperty))
126130
properties.Add(stateTypeProperty);
127131
}
128132
}
@@ -143,7 +147,7 @@ void Write<TState>(LogEventLevel level, EventId eventId, TState state, Exception
143147

144148
if (propertyName != null)
145149
{
146-
if (logger.BindProperty(propertyName, AsLoggableValue(state, formatter!), false, out var property))
150+
if (_logger.BindProperty(propertyName, AsLoggableValue(state, formatter!), false, out var property))
147151
properties.Add(property);
148152
}
149153
}
@@ -152,8 +156,7 @@ void Write<TState>(LogEventLevel level, EventId eventId, TState state, Exception
152156
properties.Add(CreateEventIdProperty(eventId));
153157

154158
var parsedTemplate = MessageTemplateParser.Parse(messageTemplate ?? "");
155-
var evt = new LogEvent(DateTimeOffset.Now, level, exception, parsedTemplate, properties);
156-
logger.Write(evt);
159+
return new LogEvent(DateTimeOffset.Now, level, exception, parsedTemplate, properties);
157160
}
158161

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

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using Serilog.Debugging;
88
using Serilog.Extensions.Logging.Tests.Support;
99
using Xunit;
10+
using Serilog.Core;
1011

1112
namespace Serilog.Extensions.Logging.Tests;
1213

@@ -469,4 +470,27 @@ public void MismatchedMessageTemplateParameterCountIsHandled()
469470

470471
Assert.Empty(sink.Writes);
471472
}
473+
474+
[Fact]
475+
public void ExceptionFromAuditSinkIsUnhandled()
476+
{
477+
var serilogLogger = new LoggerConfiguration()
478+
.AuditTo.Sink(new MySink())
479+
.CreateLogger();
480+
481+
var provider = new SerilogLoggerProvider(serilogLogger);
482+
var logger = provider.CreateLogger(Name);
483+
484+
var ex = Assert.Throws<AggregateException>(() => logger.LogInformation("Normal text"));
485+
Assert.IsType<NotImplementedException>(ex.InnerException);
486+
Assert.Equal("Oops", ex.InnerException.Message);
487+
}
488+
489+
private class MySink : ILogEventSink
490+
{
491+
public void Emit(LogEvent logEvent)
492+
{
493+
throw new NotImplementedException("Oops");
494+
}
495+
}
472496
}

0 commit comments

Comments
 (0)