diff --git a/src/NLog.Extensions.Logging/Logging/NLogLogger.cs b/src/NLog.Extensions.Logging/Logging/NLogLogger.cs index f8c95850..19a8dce7 100644 --- a/src/NLog.Extensions.Logging/Logging/NLogLogger.cs +++ b/src/NLog.Extensions.Logging/Logging/NLogLogger.cs @@ -32,19 +32,22 @@ public NLogLogger(Logger logger, NLogProviderOptions options, NLogBeginScopePars public void Log(Microsoft.Extensions.Logging.LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) { var nLogLogLevel = ConvertLogLevel(logLevel); - if (!IsEnabled(nLogLogLevel)) + if (!_logger.IsEnabled(nLogLogLevel)) { return; } + if (formatter == null) { throw new ArgumentNullException(nameof(formatter)); } - var messageParameters = NLogMessageParameterList.TryParse(_options.CaptureMessageTemplates ? state as IReadOnlyList> : null); + var messageParameters = _options.CaptureMessageTemplates + ? NLogMessageParameterList.TryParse(state as IReadOnlyList>) + : null; LogEventInfo eventInfo = - TryParseLogEventInfo(nLogLogLevel, messageParameters) ?? + TryParseMessageTemplate(nLogLogLevel, messageParameters) ?? CreateLogEventInfo(nLogLogLevel, formatter(state, exception), messageParameters); if (exception != null) @@ -52,13 +55,16 @@ public void Log(Microsoft.Extensions.Logging.LogLevel logLevel, EventId eventInfo.Exception = exception; } - CaptureEventId(eventInfo, eventId); - - if (messageParameters == null) + if (messageParameters == null && _options.CaptureMessageProperties) { - CaptureMessageProperties(eventInfo, state); + if (!_options.CaptureMessageTemplates && !CaptureMessagePropertiesList(eventInfo, state)) + { + CaptureMessageProperties(eventInfo, state); + } } + CaptureEventId(eventInfo, eventId); + _logger.Log(typeof(Microsoft.Extensions.Logging.ILogger), eventInfo); } @@ -99,7 +105,7 @@ private LogEventInfo CreateLogEventInfo(LogLevel nLogLogLevel, string message, N /// /// Using the NLog MesageTemplate Parser will hurt performance: 1 x Microsoft Parser - 2 x NLog Parser - 1 x NLog Formatter /// - private LogEventInfo TryParseLogEventInfo(LogLevel nLogLogLevel, NLogMessageParameterList messageParameters) + private LogEventInfo TryParseMessageTemplate(LogLevel nLogLogLevel, NLogMessageParameterList messageParameters) { if (messageParameters?.OriginalMessage != null && (messageParameters.HasComplexParameters || (_options.ParseMessageTemplates && messageParameters.Count > 0))) { @@ -304,7 +310,7 @@ private static Tuple CreateEventIdPropertyNames(string e private void CaptureMessageProperties(LogEventInfo eventInfo, TState state) { - if (_options.CaptureMessageProperties && state is IEnumerable> messageProperties) + if (state is IEnumerable> messageProperties) { foreach (var property in messageProperties) { @@ -316,6 +322,27 @@ private void CaptureMessageProperties(LogEventInfo eventInfo, TState sta } } + private bool CaptureMessagePropertiesList(LogEventInfo eventInfo, TState state) + { + if (state is IReadOnlyList> messageProperties) + { + for (int i = 0; i < messageProperties.Count; ++i) + { + var property = messageProperties[i]; + if (String.IsNullOrEmpty(property.Key)) + continue; + + if (i == messageProperties.Count - 1 && property.Key == OriginalFormatPropertyName) + continue; + + eventInfo.Properties[property.Key] = property.Value; + } + return true; + } + + return false; + } + /// /// Is logging enabled for this logger at this ? /// diff --git a/src/NLog.Extensions.Logging/Logging/NLogLoggerProvider.cs b/src/NLog.Extensions.Logging/Logging/NLogLoggerProvider.cs index ffe7bce8..f42efef7 100644 --- a/src/NLog.Extensions.Logging/Logging/NLogLoggerProvider.cs +++ b/src/NLog.Extensions.Logging/Logging/NLogLoggerProvider.cs @@ -47,10 +47,10 @@ public NLogLoggerProvider(NLogProviderOptions options) /// New Logger public Microsoft.Extensions.Logging.ILogger CreateLogger(string name) { - var beginScopeExtractor = ((Options?.CaptureMessageProperties ?? true) && (Options?.IncludeScopes ?? true)) + var beginScopeParser = ((Options?.CaptureMessageProperties ?? true) && (Options?.IncludeScopes ?? true)) ? (_beginScopeParser ?? System.Threading.Interlocked.CompareExchange(ref _beginScopeParser, new NLogBeginScopeParser(Options), null)) : null; - return new NLogLogger(LogManager.GetLogger(name), Options, beginScopeExtractor); + return new NLogLogger(LogManager.GetLogger(name), Options, beginScopeParser); } ///