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 ;
@@ -16,7 +15,6 @@ namespace Serilog.Extensions.Logging
1615 class SerilogLogger : FrameworkLogger
1716 {
1817 readonly SerilogLoggerProvider _provider ;
19- readonly string _name ;
2018 readonly ILogger _logger ;
2119
2220 static readonly MessageTemplateParser _messageTemplateParser = new MessageTemplateParser ( ) ;
@@ -28,13 +26,12 @@ public SerilogLogger(
2826 {
2927 if ( provider == null ) throw new ArgumentNullException ( nameof ( provider ) ) ;
3028 _provider = provider ;
31- _name = name ;
3229 _logger = logger ;
3330
3431 // If a logger was passed, the provider has already added itself as an enricher
3532 _logger = _logger ?? Serilog . Log . Logger . ForContext ( new [ ] { provider } ) ;
3633
37- if ( _name != null )
34+ if ( name != null )
3835 {
3936 _logger = _logger . ForContext ( Constants . SourceContextPropertyName , name ) ;
4037 }
@@ -47,7 +44,7 @@ public bool IsEnabled(LogLevel logLevel)
4744
4845 public IDisposable BeginScope < TState > ( TState state )
4946 {
50- return _provider . BeginScope ( _name , state ) ;
47+ return _provider . BeginScope ( state ) ;
5148 }
5249
5350 public void Log < TState > ( LogLevel logLevel , EventId eventId , TState state , Exception exception , Func < TState , Exception , string > formatter )
@@ -61,6 +58,8 @@ public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Except
6158 var logger = _logger ;
6259 string messageTemplate = null ;
6360
61+ var properties = new List < LogEventProperty > ( ) ;
62+
6463 var structure = state as IEnumerable < KeyValuePair < string , object > > ;
6564 if ( structure != null )
6665 {
@@ -72,11 +71,15 @@ public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Except
7271 }
7372 else if ( property . Key . StartsWith ( "@" ) )
7473 {
75- 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 ) ;
7677 }
7778 else
7879 {
79- 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 ) ;
8083 }
8184 }
8285
@@ -86,24 +89,28 @@ public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Except
8689 if ( messageTemplate == null && ! stateTypeInfo . IsGenericType )
8790 {
8891 messageTemplate = "{" + stateType . Name + ":l}" ;
89- 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 ) ;
9095 }
9196 }
9297
9398 if ( messageTemplate == null && state != null )
9499 {
95100 messageTemplate = "{State:l}" ;
96- 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 ) ;
97104 }
98105
99106 if ( string . IsNullOrEmpty ( messageTemplate ) )
100107 return ;
101108
102- if ( eventId . Id != 0 )
103- logger = logger . ForContext ( "EventId" , eventId ) ;
109+ if ( eventId . Id != 0 || eventId . Name != null )
110+ properties . Add ( CreateEventIdProperty ( eventId ) ) ;
104111
105112 var parsedTemplate = _messageTemplateParser . Parse ( messageTemplate ) ;
106- var evt = new LogEvent ( DateTimeOffset . Now , level , exception , parsedTemplate , Enumerable . Empty < LogEventProperty > ( ) ) ;
113+ var evt = new LogEvent ( DateTimeOffset . Now , level , exception , parsedTemplate , properties ) ;
107114 logger . Write ( evt ) ;
108115 }
109116
@@ -135,5 +142,22 @@ static LogEventLevel ConvertLevel(LogLevel logLevel)
135142 return LogEventLevel . Verbose ;
136143 }
137144 }
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+ }
138162 }
139163}
0 commit comments