2
2
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3
3
4
4
using System ;
5
- using System . Globalization ;
6
5
using Serilog . Events ;
7
6
using Microsoft . Extensions . Logging ;
8
7
using NUnit . Framework ;
9
8
using System . Collections . Generic ;
9
+ using System . IO ;
10
+ using Serilog . Debugging ;
10
11
11
12
namespace Serilog . Framework . Logging . Test
12
13
{
13
14
[ TestFixture ]
14
15
public class SerilogLoggerTest
15
16
{
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" ;
19
19
20
20
private Tuple < SerilogLogger , SerilogSink > SetUp ( LogLevel logLevel )
21
21
{
@@ -30,29 +30,34 @@ private Tuple<SerilogLogger, SerilogSink> SetUp(LogLevel logLevel)
30
30
SetMinLevel ( config , logLevel ) ;
31
31
32
32
var provider = new SerilogLoggerProvider ( config . CreateLogger ( ) ) ;
33
- var logger = ( SerilogLogger ) provider . CreateLogger ( _name ) ;
33
+ var logger = ( SerilogLogger ) provider . CreateLogger ( Name ) ;
34
34
35
35
return new Tuple < SerilogLogger , SerilogSink > ( logger , sink ) ;
36
36
}
37
37
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 )
39
44
{
40
45
switch ( logLevel )
41
46
{
42
47
case LogLevel . Debug :
43
- return serilog . MinimumLevel . Verbose ( ) ;
48
+ return LogEventLevel . Verbose ;
44
49
case LogLevel . Verbose :
45
- return serilog . MinimumLevel . Debug ( ) ;
50
+ return LogEventLevel . Debug ;
46
51
case LogLevel . Information :
47
- return serilog . MinimumLevel . Information ( ) ;
52
+ return LogEventLevel . Information ;
48
53
case LogLevel . Warning :
49
- return serilog . MinimumLevel . Warning ( ) ;
54
+ return LogEventLevel . Warning ;
50
55
case LogLevel . Error :
51
- return serilog . MinimumLevel . Error ( ) ;
56
+ return LogEventLevel . Error ;
52
57
case LogLevel . Critical :
53
- return serilog . MinimumLevel . Fatal ( ) ;
58
+ return LogEventLevel . Fatal ;
54
59
default :
55
- return serilog . MinimumLevel . Verbose ( ) ;
60
+ return LogEventLevel . Verbose ;
56
61
}
57
62
}
58
63
@@ -63,7 +68,7 @@ public void LogsWhenNullFilterGiven()
63
68
var logger = t . Item1 ;
64
69
var sink = t . Item2 ;
65
70
66
- logger . Log ( LogLevel . Information , 0 , _state , null , null ) ;
71
+ logger . Log ( LogLevel . Information , 0 , TestMessage , null , null ) ;
67
72
68
73
Assert . AreEqual ( 1 , sink . Writes . Count ) ;
69
74
}
@@ -75,12 +80,12 @@ public void LogsCorrectLevel()
75
80
var logger = t . Item1 ;
76
81
var sink = t . Item2 ;
77
82
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 ) ;
84
89
85
90
Assert . AreEqual ( 6 , sink . Writes . Count ) ;
86
91
Assert . AreEqual ( LogEventLevel . Verbose , sink . Writes [ 0 ] . Level ) ;
@@ -123,26 +128,38 @@ public void LogsWhenEnabled(LogLevel minLevel, LogLevel logLevel, int expected)
123
128
var logger = t . Item1 ;
124
129
var sink = t . Item2 ;
125
130
126
- logger . Log ( logLevel , 0 , _state , null , null ) ;
131
+ logger . Log ( logLevel , 0 , TestMessage , null , null ) ;
127
132
128
133
Assert . AreEqual ( expected , sink . Writes . Count ) ;
129
134
}
130
135
131
-
132
136
[ Test ]
133
137
public void LogsCorrectMessage ( )
134
138
{
135
139
var t = SetUp ( LogLevel . Verbose ) ;
136
140
var logger = t . Item1 ;
137
141
var sink = t . Item2 ;
138
142
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
+
139
157
var exception = new Exception ( ) ;
140
158
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 ) ;
143
160
144
161
Assert . AreEqual ( 1 , sink . Writes . Count ) ;
145
- Assert . AreEqual ( _state , sink . Writes [ 0 ] . RenderMessage ( ) ) ;
162
+ Assert . AreSame ( exception , sink . Writes [ 0 ] . Exception ) ;
146
163
}
147
164
148
165
[ Test ]
@@ -154,7 +171,7 @@ public void SingleScopeProperty()
154
171
155
172
using ( logger . BeginScopeImpl ( new FoodScope ( "pizza" ) ) )
156
173
{
157
- logger . Log ( LogLevel . Information , 0 , _state , null , null ) ;
174
+ logger . Log ( LogLevel . Information , 0 , TestMessage , null , null ) ;
158
175
}
159
176
160
177
Assert . AreEqual ( 1 , sink . Writes . Count ) ;
@@ -173,7 +190,7 @@ public void NestedScopeSameProperty()
173
190
{
174
191
using ( logger . BeginScopeImpl ( new FoodScope ( "bacon" ) ) )
175
192
{
176
- logger . Log ( LogLevel . Information , 0 , _state , null , null ) ;
193
+ logger . Log ( LogLevel . Information , 0 , TestMessage , null , null ) ;
177
194
}
178
195
}
179
196
@@ -194,7 +211,7 @@ public void NestedScopesDifferentProperties()
194
211
{
195
212
using ( logger . BeginScopeImpl ( new LuckyScope ( 7 ) ) )
196
213
{
197
- logger . Log ( LogLevel . Information , 0 , _state , null , null ) ;
214
+ logger . Log ( LogLevel . Information , 0 , TestMessage , null , null ) ;
198
215
}
199
216
}
200
217
@@ -205,9 +222,29 @@ public void NestedScopesDifferentProperties()
205
222
Assert . AreEqual ( "7" , sink . Writes [ 0 ] . Properties [ "LuckyNumber" ] . ToString ( ) ) ;
206
223
}
207
224
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
+
208
245
private class FoodScope : ILogValues
209
246
{
210
- private string _name ;
247
+ readonly string _name ;
211
248
212
249
public FoodScope ( string name )
213
250
{
@@ -222,7 +259,7 @@ public IEnumerable<KeyValuePair<string, object>> GetValues()
222
259
223
260
private class LuckyScope : ILogValues
224
261
{
225
- private int _luckyNumber ;
262
+ readonly int _luckyNumber ;
226
263
227
264
public LuckyScope ( int luckyNumber )
228
265
{
0 commit comments