44using Microsoft . Extensions . Logging ;
55using System ;
66using System . Collections . Generic ;
7- using System . Linq ;
87using Serilog . Core ;
98using Serilog . Events ;
109using FrameworkLogger = Microsoft . Extensions . Logging . ILogger ;
@@ -59,6 +58,8 @@ public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Except
5958 var logger = _logger ;
6059 string messageTemplate = null ;
6160
61+ var properties = new List < LogEventProperty > ( ) ;
62+
6263 var structure = state as IEnumerable < KeyValuePair < string , object > > ;
6364 if ( structure != null )
6465 {
@@ -70,11 +71,15 @@ public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Except
7071 }
7172 else if ( property . Key . StartsWith ( "@" ) )
7273 {
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 ) ;
7477 }
7578 else
7679 {
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 ) ;
7883 }
7984 }
8085
@@ -84,24 +89,28 @@ public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Except
8489 if ( messageTemplate == null && ! stateTypeInfo . IsGenericType )
8590 {
8691 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 ) ;
8895 }
8996 }
9097
9198 if ( messageTemplate == null && state != null )
9299 {
93100 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 ) ;
95104 }
96105
97106 if ( string . IsNullOrEmpty ( messageTemplate ) )
98107 return ;
99108
100109 if ( eventId . Id != 0 || eventId . Name != null )
101- logger = logger . ForContext ( new [ ] { new EventIdEnricher ( eventId ) } ) ;
110+ properties . Add ( CreateEventIdProperty ( eventId ) ) ;
102111
103112 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 ) ;
105114 logger . Write ( evt ) ;
106115 }
107116
@@ -133,5 +142,22 @@ static LogEventLevel ConvertLevel(LogLevel logLevel)
133142 return LogEventLevel . Verbose ;
134143 }
135144 }
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+ }
136162 }
137163}
0 commit comments