Skip to content

Commit c72d9e1

Browse files
committed
Fixes #18 - don't use the property binder when the arguments aren't there to be bound.
1 parent 15923bb commit c72d9e1

File tree

3 files changed

+77
-37
lines changed

3 files changed

+77
-37
lines changed

src/Serilog.Framework.Logging/SerilogLogger.cs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33

44
using Microsoft.Extensions.Logging;
55
using System;
6+
using System.Linq;
67
using Serilog.Core;
78
using Serilog.Events;
89
using FrameworkLogger = Microsoft.Extensions.Logging.ILogger;
910
using System.Reflection;
11+
using Serilog.Parsing;
1012

1113
namespace Serilog.Framework.Logging
1214
{
@@ -16,6 +18,8 @@ public class SerilogLogger : FrameworkLogger
1618
readonly string _name;
1719
readonly ILogger _logger;
1820

21+
static readonly MessageTemplateParser _messageTemplateParser = new MessageTemplateParser();
22+
1923
public SerilogLogger(
2024
SerilogLoggerProvider provider,
2125
ILogger logger = null,
@@ -26,11 +30,8 @@ public SerilogLogger(
2630
_name = name;
2731
_logger = logger;
2832

29-
if (_logger == null)
30-
{
31-
// If a logger was passed, the provider has already added itself as an enricher
32-
_logger = Serilog.Log.Logger.ForContext(new[] { provider });
33-
}
33+
// If a logger was passed, the provider has already added itself as an enricher
34+
_logger = _logger ?? Serilog.Log.Logger.ForContext(new[] { provider });
3435

3536
if (_name != null)
3637
{
@@ -103,7 +104,9 @@ public void Log(LogLevel logLevel, int eventId, object state, Exception exceptio
103104
logger = logger.ForContext("EventId", eventId);
104105
}
105106

106-
logger.Write(level, exception, messageTemplate);
107+
var parsedTemplate = _messageTemplateParser.Parse(messageTemplate);
108+
var evt = new LogEvent(DateTimeOffset.Now, level, exception, parsedTemplate, Enumerable.Empty<LogEventProperty>());
109+
logger.Write(evt);
107110
}
108111

109112
private LogEventLevel ConvertLevel(LogLevel logLevel)

src/Serilog.Framework.Logging/SerilogLoggerProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public SerilogLoggerScope CurrentScope
7878
get
7979
{
8080
var objectHandle = CallContext.LogicalGetData(_currentScopeKey) as ObjectHandle;
81-
return objectHandle != null ? objectHandle.Unwrap() as SerilogLoggerScope : null;
81+
return objectHandle?.Unwrap() as SerilogLoggerScope;
8282
}
8383
set
8484
{

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

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

44
using System;
5-
using System.Globalization;
65
using Serilog.Events;
76
using Microsoft.Extensions.Logging;
87
using NUnit.Framework;
98
using System.Collections.Generic;
9+
using System.IO;
10+
using Serilog.Debugging;
1011

1112
namespace Serilog.Framework.Logging.Test
1213
{
1314
[TestFixture]
1415
public class SerilogLoggerTest
1516
{
16-
private const string _name = "test";
17-
private const string _state = "This is a test";
18-
private static readonly Func<object, Exception, string> TheMessageAndError = (message, error) => string.Format(CultureInfo.CurrentCulture, "{0}:{1}", message, error);
17+
private const string Name = "test";
18+
private const string TestMessage = "This is a test";
1919

2020
private Tuple<SerilogLogger, SerilogSink> SetUp(LogLevel logLevel)
2121
{
@@ -30,29 +30,34 @@ private Tuple<SerilogLogger, SerilogSink> SetUp(LogLevel logLevel)
3030
SetMinLevel(config, logLevel);
3131

3232
var provider = new SerilogLoggerProvider(config.CreateLogger());
33-
var logger = (SerilogLogger)provider.CreateLogger(_name);
33+
var logger = (SerilogLogger)provider.CreateLogger(Name);
3434

3535
return new Tuple<SerilogLogger, SerilogSink>(logger, sink);
3636
}
3737

38-
private LoggerConfiguration SetMinLevel(LoggerConfiguration serilog, LogLevel logLevel)
38+
private void SetMinLevel(LoggerConfiguration serilog, LogLevel logLevel)
39+
{
40+
serilog.MinimumLevel.Is(MapLevel(logLevel));
41+
}
42+
43+
private LogEventLevel MapLevel(LogLevel logLevel)
3944
{
4045
switch (logLevel)
4146
{
4247
case LogLevel.Debug:
43-
return serilog.MinimumLevel.Verbose();
48+
return LogEventLevel.Verbose;
4449
case LogLevel.Verbose:
45-
return serilog.MinimumLevel.Debug();
50+
return LogEventLevel.Debug;
4651
case LogLevel.Information:
47-
return serilog.MinimumLevel.Information();
52+
return LogEventLevel.Information;
4853
case LogLevel.Warning:
49-
return serilog.MinimumLevel.Warning();
54+
return LogEventLevel.Warning;
5055
case LogLevel.Error:
51-
return serilog.MinimumLevel.Error();
56+
return LogEventLevel.Error;
5257
case LogLevel.Critical:
53-
return serilog.MinimumLevel.Fatal();
58+
return LogEventLevel.Fatal;
5459
default:
55-
return serilog.MinimumLevel.Verbose();
60+
return LogEventLevel.Verbose;
5661
}
5762
}
5863

@@ -63,7 +68,7 @@ public void LogsWhenNullFilterGiven()
6368
var logger = t.Item1;
6469
var sink = t.Item2;
6570

66-
logger.Log(LogLevel.Information, 0, _state, null, null);
71+
logger.Log(LogLevel.Information, 0, TestMessage, null, null);
6772

6873
Assert.AreEqual(1, sink.Writes.Count);
6974
}
@@ -75,12 +80,12 @@ public void LogsCorrectLevel()
7580
var logger = t.Item1;
7681
var sink = t.Item2;
7782

78-
logger.Log(LogLevel.Debug, 0, _state, null, null);
79-
logger.Log(LogLevel.Verbose, 0, _state, null, null);
80-
logger.Log(LogLevel.Information, 0, _state, null, null);
81-
logger.Log(LogLevel.Warning, 0, _state, null, null);
82-
logger.Log(LogLevel.Error, 0, _state, null, null);
83-
logger.Log(LogLevel.Critical, 0, _state, null, null);
83+
logger.Log(LogLevel.Debug, 0, TestMessage, null, null);
84+
logger.Log(LogLevel.Verbose, 0, TestMessage, null, null);
85+
logger.Log(LogLevel.Information, 0, TestMessage, null, null);
86+
logger.Log(LogLevel.Warning, 0, TestMessage, null, null);
87+
logger.Log(LogLevel.Error, 0, TestMessage, null, null);
88+
logger.Log(LogLevel.Critical, 0, TestMessage, null, null);
8489

8590
Assert.AreEqual(6, sink.Writes.Count);
8691
Assert.AreEqual(LogEventLevel.Verbose, sink.Writes[0].Level);
@@ -123,26 +128,38 @@ public void LogsWhenEnabled(LogLevel minLevel, LogLevel logLevel, int expected)
123128
var logger = t.Item1;
124129
var sink = t.Item2;
125130

126-
logger.Log(logLevel, 0, _state, null, null);
131+
logger.Log(logLevel, 0, TestMessage, null, null);
127132

128133
Assert.AreEqual(expected, sink.Writes.Count);
129134
}
130135

131-
132136
[Test]
133137
public void LogsCorrectMessage()
134138
{
135139
var t = SetUp(LogLevel.Verbose);
136140
var logger = t.Item1;
137141
var sink = t.Item2;
138142

143+
logger.Log(LogLevel.Information, 0, null, null, null);
144+
logger.Log(LogLevel.Information, 0, TestMessage, null, null);
145+
146+
Assert.AreEqual(1, sink.Writes.Count);
147+
Assert.AreEqual(TestMessage, sink.Writes[0].RenderMessage());
148+
}
149+
150+
[Test]
151+
public void CarriesException()
152+
{
153+
var t = SetUp(LogLevel.Verbose);
154+
var logger = t.Item1;
155+
var sink = t.Item2;
156+
139157
var exception = new Exception();
140158

141-
logger.Log(LogLevel.Information, 0, null, null, null);
142-
logger.Log(LogLevel.Information, 0, _state, null, null);
159+
logger.Log(LogLevel.Information, 0, "Test", exception, null);
143160

144161
Assert.AreEqual(1, sink.Writes.Count);
145-
Assert.AreEqual(_state, sink.Writes[0].RenderMessage());
162+
Assert.AreSame(exception, sink.Writes[0].Exception);
146163
}
147164

148165
[Test]
@@ -154,7 +171,7 @@ public void SingleScopeProperty()
154171

155172
using (logger.BeginScopeImpl(new FoodScope("pizza")))
156173
{
157-
logger.Log(LogLevel.Information, 0, _state, null, null);
174+
logger.Log(LogLevel.Information, 0, TestMessage, null, null);
158175
}
159176

160177
Assert.AreEqual(1, sink.Writes.Count);
@@ -173,7 +190,7 @@ public void NestedScopeSameProperty()
173190
{
174191
using (logger.BeginScopeImpl(new FoodScope("bacon")))
175192
{
176-
logger.Log(LogLevel.Information, 0, _state, null, null);
193+
logger.Log(LogLevel.Information, 0, TestMessage, null, null);
177194
}
178195
}
179196

@@ -194,7 +211,7 @@ public void NestedScopesDifferentProperties()
194211
{
195212
using (logger.BeginScopeImpl(new LuckyScope(7)))
196213
{
197-
logger.Log(LogLevel.Information, 0, _state, null, null);
214+
logger.Log(LogLevel.Information, 0, TestMessage, null, null);
198215
}
199216
}
200217

@@ -205,9 +222,29 @@ public void NestedScopesDifferentProperties()
205222
Assert.AreEqual("7", sink.Writes[0].Properties["LuckyNumber"].ToString());
206223
}
207224

225+
[Test]
226+
public void CarriesMessageTemplateProperties()
227+
{
228+
var selfLog = new StringWriter();
229+
SelfLog.Out = selfLog;
230+
231+
var t = SetUp(LogLevel.Verbose);
232+
var logger = t.Item1;
233+
var sink = t.Item2;
234+
235+
logger.LogInformation("Hello, {Recipient}", "World");
236+
237+
Assert.True(sink.Writes[0].Properties.ContainsKey("Recipient"));
238+
Assert.AreEqual("\"World\"", sink.Writes[0].Properties["Recipient"].ToString());
239+
Assert.AreEqual("Hello, {Recipient}", sink.Writes[0].MessageTemplate.Text);
240+
241+
SelfLog.Out = null;
242+
Assert.IsEmpty(selfLog.ToString());
243+
}
244+
208245
private class FoodScope : ILogValues
209246
{
210-
private string _name;
247+
readonly string _name;
211248

212249
public FoodScope(string name)
213250
{
@@ -222,7 +259,7 @@ public IEnumerable<KeyValuePair<string, object>> GetValues()
222259

223260
private class LuckyScope : ILogValues
224261
{
225-
private int _luckyNumber;
262+
readonly int _luckyNumber;
226263

227264
public LuckyScope(int luckyNumber)
228265
{

0 commit comments

Comments
 (0)