4
4
using Microsoft . Extensions . Logging ;
5
5
using System ;
6
6
using System . Collections . Generic ;
7
+ using System . Linq ;
7
8
using Serilog . Core ;
8
9
using Serilog . Events ;
9
10
using FrameworkLogger = Microsoft . Extensions . Logging . ILogger ;
@@ -17,15 +18,19 @@ class SerilogLogger : FrameworkLogger
17
18
readonly SerilogLoggerProvider _provider ;
18
19
readonly ILogger _logger ;
19
20
20
- static readonly MessageTemplateParser _messageTemplateParser = new MessageTemplateParser ( ) ;
21
+ static readonly MessageTemplateParser MessageTemplateParser = new MessageTemplateParser ( ) ;
22
+
23
+ // It's rare to see large event ids, as they are category-specific
24
+ static readonly LogEventProperty [ ] LowEventIdValues = Enumerable . Range ( 0 , 48 )
25
+ . Select ( n => new LogEventProperty ( "Id" , new ScalarValue ( n ) ) )
26
+ . ToArray ( ) ;
21
27
22
28
public SerilogLogger (
23
29
SerilogLoggerProvider provider ,
24
30
ILogger logger = null ,
25
31
string name = null )
26
32
{
27
- if ( provider == null ) throw new ArgumentNullException ( nameof ( provider ) ) ;
28
- _provider = provider ;
33
+ _provider = provider ?? throw new ArgumentNullException ( nameof ( provider ) ) ;
29
34
_logger = logger ;
30
35
31
36
// If a logger was passed, the provider has already added itself as an enricher
@@ -60,25 +65,22 @@ public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Except
60
65
61
66
var properties = new List < LogEventProperty > ( ) ;
62
67
63
- var structure = state as IEnumerable < KeyValuePair < string , object > > ;
64
- if ( structure != null )
68
+ if ( state is IEnumerable < KeyValuePair < string , object > > structure )
65
69
{
66
70
foreach ( var property in structure )
67
71
{
68
- if ( property . Key == SerilogLoggerProvider . OriginalFormatPropertyName && property . Value is string )
72
+ if ( property . Key == SerilogLoggerProvider . OriginalFormatPropertyName && property . Value is string value )
69
73
{
70
- messageTemplate = ( string ) property . Value ;
74
+ messageTemplate = value ;
71
75
}
72
76
else if ( property . Key . StartsWith ( "@" ) )
73
77
{
74
- LogEventProperty destructured ;
75
- if ( logger . BindProperty ( property . Key . Substring ( 1 ) , property . Value , true , out destructured ) )
78
+ if ( logger . BindProperty ( property . Key . Substring ( 1 ) , property . Value , true , out var destructured ) )
76
79
properties . Add ( destructured ) ;
77
80
}
78
81
else
79
82
{
80
- LogEventProperty bound ;
81
- if ( logger . BindProperty ( property . Key , property . Value , false , out bound ) )
83
+ if ( logger . BindProperty ( property . Key , property . Value , false , out var bound ) )
82
84
properties . Add ( bound ) ;
83
85
}
84
86
}
@@ -89,8 +91,7 @@ public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Except
89
91
if ( messageTemplate == null && ! stateTypeInfo . IsGenericType )
90
92
{
91
93
messageTemplate = "{" + stateType . Name + ":l}" ;
92
- LogEventProperty stateTypeProperty ;
93
- if ( logger . BindProperty ( stateType . Name , AsLoggableValue ( state , formatter ) , false , out stateTypeProperty ) )
94
+ if ( logger . BindProperty ( stateType . Name , AsLoggableValue ( state , formatter ) , false , out var stateTypeProperty ) )
94
95
properties . Add ( stateTypeProperty ) ;
95
96
}
96
97
}
@@ -111,16 +112,15 @@ public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Except
111
112
112
113
if ( propertyName != null )
113
114
{
114
- LogEventProperty property ;
115
- if ( logger . BindProperty ( propertyName , AsLoggableValue ( state , formatter ) , false , out property ) )
115
+ if ( logger . BindProperty ( propertyName , AsLoggableValue ( state , formatter ) , false , out var property ) )
116
116
properties . Add ( property ) ;
117
117
}
118
118
}
119
119
120
120
if ( eventId . Id != 0 || eventId . Name != null )
121
121
properties . Add ( CreateEventIdProperty ( eventId ) ) ;
122
122
123
- var parsedTemplate = _messageTemplateParser . Parse ( messageTemplate ?? "" ) ;
123
+ var parsedTemplate = MessageTemplateParser . Parse ( messageTemplate ?? "" ) ;
124
124
var evt = new LogEvent ( DateTimeOffset . Now , level , exception , parsedTemplate , properties ) ;
125
125
logger . Write ( evt ) ;
126
126
}
@@ -133,13 +133,17 @@ static object AsLoggableValue<TState>(TState state, Func<TState, Exception, stri
133
133
return sobj ;
134
134
}
135
135
136
- static LogEventProperty CreateEventIdProperty ( EventId eventId )
136
+ internal static LogEventProperty CreateEventIdProperty ( EventId eventId )
137
137
{
138
138
var properties = new List < LogEventProperty > ( 2 ) ;
139
139
140
140
if ( eventId . Id != 0 )
141
141
{
142
- properties . Add ( new LogEventProperty ( "Id" , new ScalarValue ( eventId . Id ) ) ) ;
142
+ if ( eventId . Id < LowEventIdValues . Length )
143
+ // Avoid some allocations
144
+ properties . Add ( LowEventIdValues [ eventId . Id ] ) ;
145
+ else
146
+ properties . Add ( new LogEventProperty ( "Id" , new ScalarValue ( eventId . Id ) ) ) ;
143
147
}
144
148
145
149
if ( eventId . Name != null )
0 commit comments