|
11 | 11 | using Akka.Dispatch; |
12 | 12 | using Akka.Event; |
13 | 13 | using NLog; |
| 14 | +using NLog.MessageTemplates; |
14 | 15 | using NLogger = global::NLog.Logger; |
15 | 16 | using NLogLevel = global::NLog.LogLevel; |
16 | 17 |
|
@@ -62,23 +63,25 @@ private static void LogEvent(LogEvent logEvent, NLogLevel logLevel) |
62 | 63 | logEventInfo.Properties["actorPath"] = actorPath; // Same as Serilog |
63 | 64 | logEventInfo.Properties["threadId"] = logEvent.Thread.ManagedThreadId; // ThreadId of the original LogEvent (instead of async Logger threadid) |
64 | 65 |
|
65 | | - // Add structured logging properties from semantic logging |
66 | | - // This enables NLog layouts and targets to access structured properties by name |
67 | | - if (logEvent.TryGetProperties(out var properties)) |
68 | | - { |
69 | | - foreach (var prop in properties) |
70 | | - { |
71 | | - logEventInfo.Properties[prop.Key] = prop.Value; |
72 | | - } |
73 | | - } |
74 | | - |
75 | 66 | logger.Log(logEventInfo); |
76 | 67 | } |
77 | 68 |
|
78 | 69 | private static LogEventInfo CreateLogEventInfo(NLogger logger, NLogLevel level, LogEvent logEvent) |
79 | 70 | { |
80 | 71 | if (logEvent.Message is LogMessage logMessage) |
81 | 72 | { |
| 73 | + var properties = logMessage.GetProperties(); |
| 74 | + if (properties?.Count > 0) |
| 75 | + { |
| 76 | + var formattedMessage = logMessage.ToString(); |
| 77 | + var logEventInfo = new LogEventInfo(level, logger.Name, formattedMessage, logMessage.Format, Array.Empty<MessageTemplateParameter>()); |
| 78 | + foreach (var prop in properties) |
| 79 | + { |
| 80 | + logEventInfo.Properties[prop.Key] = prop.Value; |
| 81 | + } |
| 82 | + return logEventInfo; |
| 83 | + } |
| 84 | + |
82 | 85 | var parameters = logMessage.Parameters(); |
83 | 86 | var parameterArray = parameters as object[] ?? parameters?.ToArray(); |
84 | 87 | return new LogEventInfo(level, logger.Name, null, logMessage.Format, parameterArray, logEvent.Cause); |
|
0 commit comments