@@ -59,10 +59,11 @@ private LogEventInfo CreateLogEventInfo<TState>(LogLevel nLogLogLevel, EventId e
5959 var messageParameters = NLogMessageParameterList . TryParse ( messagePropertyList ) ;
6060 if ( messageParameters . Count == 0 )
6161 {
62- var logEvent = LogEventInfo . Create ( nLogLogLevel , _logger . Name , formatter ( state , exception ) ) ;
62+ var logEvent = TryParsePostionalMessageTemplate ( nLogLogLevel , messagePropertyList , messageParameters )
63+ ?? CaputureBasicLogEvent ( nLogLogLevel , formatter ( state , exception ) , messagePropertyList , messageParameters ) ;
6364 CaptureEventIdProperties ( logEvent , eventId ) ;
6465 return logEvent ;
65- }
66+ }
6667 else
6768 {
6869 var logEvent = TryParseMessageTemplate ( nLogLogLevel , messagePropertyList , messageParameters )
@@ -103,7 +104,7 @@ private LogEventInfo TryParseMessageTemplate(LogLevel nLogLogLevel, IReadOnlyLis
103104 {
104105 if ( messageParameters . HasMessageTemplateSyntax ( _options . ParseMessageTemplates ) )
105106 {
106- var originalMessage = messageParameters ? . GetOriginalMessage ( messageProperties ) ;
107+ var originalMessage = messageParameters . GetOriginalMessage ( messageProperties ) ;
107108 var logEvent = new LogEventInfo ( nLogLogLevel , _logger . Name , null , originalMessage , SingleItemArray ) ;
108109 var messageTemplateParameters = logEvent . MessageTemplateParameters ; // Forces parsing of OriginalMessage
109110 if ( messageTemplateParameters . Count > 0 )
@@ -119,18 +120,75 @@ private LogEventInfo TryParseMessageTemplate(LogLevel nLogLogLevel, IReadOnlyLis
119120 return null ; // Parsing not needed
120121 }
121122
123+ private LogEventInfo TryParsePostionalMessageTemplate ( LogLevel nLogLogLevel , IReadOnlyList < KeyValuePair < string , object > > messageProperties , NLogMessageParameterList messageParameters )
124+ {
125+ if ( messageParameters . IsPositional && _options . ParseMessageTemplates )
126+ {
127+ string originalMessage = TryParsePositionalParameters ( messageProperties , out var parameters ) ;
128+ if ( originalMessage != null )
129+ {
130+ return new LogEventInfo ( nLogLogLevel , _logger . Name , null , originalMessage , parameters ) ;
131+ }
132+ }
133+
134+ return null ;
135+ }
136+
122137 private LogEventInfo CaptureMessageTemplate ( LogLevel nLogLogLevel , string message , IReadOnlyList < KeyValuePair < string , object > > messageProperties , NLogMessageParameterList messageParameters )
123138 {
124139 // Parsing not needed, we take the fast route
125140 var originalMessage = messageParameters . GetOriginalMessage ( messageProperties ) ?? message ;
126- var logEvent = new LogEventInfo ( nLogLogLevel , _logger . Name , originalMessage , messageParameters ) ;
127- if ( ! ReferenceEquals ( originalMessage , message ) )
141+ var logEvent = new LogEventInfo ( nLogLogLevel , _logger . Name , message , originalMessage , messageParameters . IsPositional ? Array . Empty < MessageTemplateParameter > ( ) : messageParameters ) ;
142+ if ( _options . CaptureMessageParameters && ! ReferenceEquals ( originalMessage , message ) )
128143 {
129- SetLogEventMessageFormatter ( logEvent , messageParameters , message ) ;
144+ var parameterCount = messageParameters . Count ;
145+ if ( parameterCount > 0 )
146+ {
147+ var parameters = new object [ parameterCount ] ;
148+ for ( int i = 0 ; i < parameterCount ; ++ i )
149+ parameters [ i ] = messageParameters [ i ] . Value ;
150+ logEvent . Parameters = parameters ;
151+ }
130152 }
131153 return logEvent ;
132154 }
133155
156+ private LogEventInfo CaputureBasicLogEvent ( LogLevel nLogLogLevel , string formattedMessage , IReadOnlyList < KeyValuePair < string , object > > messageProperties , NLogMessageParameterList messageParameters )
157+ {
158+ if ( messageParameters . IsPositional && _options . CaptureMessageParameters )
159+ {
160+ string originalMessage = TryParsePositionalParameters ( messageProperties , out var parameters ) ;
161+ var logEvent = new LogEventInfo ( nLogLogLevel , _logger . Name , formattedMessage , originalMessage ?? formattedMessage , Array . Empty < MessageTemplateParameter > ( ) ) ;
162+ logEvent . Parameters = parameters ;
163+ return logEvent ;
164+ }
165+ else
166+ {
167+ return new LogEventInfo ( nLogLogLevel , _logger . Name , formattedMessage , formattedMessage , Array . Empty < MessageTemplateParameter > ( ) ) ;
168+ }
169+ }
170+
171+ private static string TryParsePositionalParameters ( IReadOnlyList < KeyValuePair < string , object > > messageProperties , out object [ ] parameters )
172+ {
173+ var parameterCount = messageProperties . Count ;
174+ var parameterIndex = 0 ;
175+ parameters = new object [ parameterCount - 1 ] ;
176+ string originalMessage = null ;
177+ for ( int i = 0 ; i < parameterCount ; ++ i )
178+ {
179+ var parameter = messageProperties [ i ] ;
180+ if ( OriginalFormatPropertyName . Equals ( parameter . Key ) )
181+ {
182+ originalMessage = parameter . Value . ToString ( ) ;
183+ }
184+ else
185+ {
186+ parameters [ parameterIndex ++ ] = parameter . Value ;
187+ }
188+ }
189+ return originalMessage ;
190+ }
191+
134192 /// <summary>
135193 /// Allocates object[]-array for <see cref="LogEventInfo.Parameters"/> after checking
136194 /// for mismatch between Microsoft Extension Logging and NLog Message Template Parser
@@ -284,16 +342,6 @@ private static int FindMaxIndex(MessageTemplateParameters messageTemplateParamet
284342 return maxIndex ;
285343 }
286344
287- private static void SetLogEventMessageFormatter ( LogEventInfo logEvent , NLogMessageParameterList messageTemplateParameters , string formattedMessage )
288- {
289- var parameters = new object [ messageTemplateParameters . Count + 1 ] ;
290- for ( int i = 0 ; i < parameters . Length - 1 ; ++ i )
291- parameters [ i ] = messageTemplateParameters [ i ] . Value ;
292- parameters [ parameters . Length - 1 ] = formattedMessage ;
293- logEvent . Parameters = parameters ;
294- logEvent . MessageFormatter = ( l ) => ( string ) l . Parameters [ l . Parameters . Length - 1 ] ;
295- }
296-
297345 private void CaptureEventIdProperties ( LogEventInfo logEvent , EventId eventId )
298346 {
299347 var captureEventId = _options . CaptureEventId ;
0 commit comments