4
4
using Microsoft . Extensions . Logging ;
5
5
using System ;
6
6
using System . Collections . Generic ;
7
- using System . Linq ;
8
7
using Serilog . Core ;
9
8
using Serilog . Events ;
10
9
using FrameworkLogger = Microsoft . Extensions . Logging . ILogger ;
@@ -59,6 +58,8 @@ public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Except
59
58
var logger = _logger ;
60
59
string messageTemplate = null ;
61
60
61
+ var properties = new List < LogEventProperty > ( ) ;
62
+
62
63
var structure = state as IEnumerable < KeyValuePair < string , object > > ;
63
64
if ( structure != null )
64
65
{
@@ -70,11 +71,15 @@ public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Except
70
71
}
71
72
else if ( property . Key . StartsWith ( "@" ) )
72
73
{
73
- logger = logger . ForContext ( property . Key . Substring ( 1 ) , property . Value , destructureObjects : true ) ;
74
+ LogEventProperty destructured ;
75
+ if ( logger . BindProperty ( property . Key . Substring ( 1 ) , property . Value , true , out destructured ) )
76
+ properties . Add ( destructured ) ;
74
77
}
75
78
else
76
79
{
77
- logger = logger . ForContext ( property . Key , property . Value ) ;
80
+ LogEventProperty bound ;
81
+ if ( logger . BindProperty ( property . Key , property . Value , false , out bound ) )
82
+ properties . Add ( bound ) ;
78
83
}
79
84
}
80
85
@@ -84,24 +89,28 @@ public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Except
84
89
if ( messageTemplate == null && ! stateTypeInfo . IsGenericType )
85
90
{
86
91
messageTemplate = "{" + stateType . Name + ":l}" ;
87
- logger = logger . ForContext ( stateType . Name , AsLoggableValue ( state , formatter ) ) ;
92
+ LogEventProperty stateTypeProperty ;
93
+ if ( logger . BindProperty ( stateType . Name , AsLoggableValue ( state , formatter ) , false , out stateTypeProperty ) )
94
+ properties . Add ( stateTypeProperty ) ;
88
95
}
89
96
}
90
97
91
98
if ( messageTemplate == null && state != null )
92
99
{
93
100
messageTemplate = "{State:l}" ;
94
- logger = logger . ForContext ( "State" , AsLoggableValue ( state , formatter ) ) ;
101
+ LogEventProperty stateProperty ;
102
+ if ( logger . BindProperty ( "State" , AsLoggableValue ( state , formatter ) , false , out stateProperty ) )
103
+ properties . Add ( stateProperty ) ;
95
104
}
96
105
97
106
if ( string . IsNullOrEmpty ( messageTemplate ) )
98
107
return ;
99
108
100
109
if ( eventId . Id != 0 || eventId . Name != null )
101
- logger = logger . ForContext ( new [ ] { new EventIdEnricher ( eventId ) } ) ;
110
+ properties . Add ( CreateEventIdProperty ( eventId ) ) ;
102
111
103
112
var parsedTemplate = _messageTemplateParser . Parse ( messageTemplate ) ;
104
- var evt = new LogEvent ( DateTimeOffset . Now , level , exception , parsedTemplate , Enumerable . Empty < LogEventProperty > ( ) ) ;
113
+ var evt = new LogEvent ( DateTimeOffset . Now , level , exception , parsedTemplate , properties ) ;
105
114
logger . Write ( evt ) ;
106
115
}
107
116
@@ -133,5 +142,22 @@ static LogEventLevel ConvertLevel(LogLevel logLevel)
133
142
return LogEventLevel . Verbose ;
134
143
}
135
144
}
145
+
146
+ static LogEventProperty CreateEventIdProperty ( EventId eventId )
147
+ {
148
+ var properties = new List < LogEventProperty > ( 2 ) ;
149
+
150
+ if ( eventId . Id != 0 )
151
+ {
152
+ properties . Add ( new LogEventProperty ( "Id" , new ScalarValue ( eventId . Id ) ) ) ;
153
+ }
154
+
155
+ if ( eventId . Name != null )
156
+ {
157
+ properties . Add ( new LogEventProperty ( "Name" , new ScalarValue ( eventId . Name ) ) ) ;
158
+ }
159
+
160
+ return new LogEventProperty ( "EventId" , new StructureValue ( properties ) ) ;
161
+ }
136
162
}
137
163
}
0 commit comments