diff --git a/src/LibLog.Example.Library/LibLog.Example.Library.csproj b/src/LibLog.Example.Library/LibLog.Example.Library.csproj index ac7e229..13d8bf6 100644 --- a/src/LibLog.Example.Library/LibLog.Example.Library.csproj +++ b/src/LibLog.Example.Library/LibLog.Example.Library.csproj @@ -10,6 +10,6 @@ TRACE;DEBUG;LIBLOG_PUBLIC - + \ No newline at end of file diff --git a/src/LibLog.Example.ProvidersOnly/LibLog.Example.ProvidersOnly.csproj b/src/LibLog.Example.ProvidersOnly/LibLog.Example.ProvidersOnly.csproj index aefe8fe..2d87787 100644 --- a/src/LibLog.Example.ProvidersOnly/LibLog.Example.ProvidersOnly.csproj +++ b/src/LibLog.Example.ProvidersOnly/LibLog.Example.ProvidersOnly.csproj @@ -10,6 +10,6 @@ TRACE;LIBLOG_PROVIDERS_ONLY - + \ No newline at end of file diff --git a/src/LibLog.Tests/LogProviders/NLogLogProviderLoggingTests.cs b/src/LibLog.Tests/LogProviders/NLogLogProviderLoggingTests.cs index 4722688..f7b6883 100644 --- a/src/LibLog.Tests/LogProviders/NLogLogProviderLoggingTests.cs +++ b/src/LibLog.Tests/LogProviders/NLogLogProviderLoggingTests.cs @@ -137,7 +137,6 @@ public void Can_open_mapped_diagnostics_context() } } -#if NLOG4 [Fact] public void Can_capture_callsite() { @@ -154,7 +153,6 @@ public void Can_capture_callsite() _sut.Info(() => "c"); myTarget.Logs[myTarget.Logs.Count - 1].ShouldBe(string.Format("INFO|{0}.{1}|c|", GetType().FullName, nameof(Can_capture_callsite))); } -#endif [Fact] public void Can_open_mapped_diagnostics_context_destructured() diff --git a/src/LibLog/LogProviders/NLogLogProvider.cs b/src/LibLog/LogProviders/NLogLogProvider.cs index 1c97dcc..d10e2b5 100644 --- a/src/LibLog/LogProviders/NLogLogProvider.cs +++ b/src/LibLog/LogProviders/NLogLogProvider.cs @@ -34,22 +34,55 @@ public static bool IsLoggerAvailable() protected override OpenNdc GetOpenNdcMethod() { + var messageParam = Expression.Parameter(typeof(string), "message"); + + var ndlcContextType = Type.GetType("NLog.NestedDiagnosticsLogicalContext, NLog"); + if (ndlcContextType != null) + { + var pushObjectMethod = ndlcContextType.GetMethod("PushObject", typeof(object)); + if (pushObjectMethod != null) + { + var pushObjectMethodCall = Expression.Call(null, pushObjectMethod, messageParam); + return Expression.Lambda(pushObjectMethodCall, messageParam).Compile(); + } + } + var ndcContextType = Type.GetType("NLog.NestedDiagnosticsContext, NLog"); var pushMethod = ndcContextType.GetMethod("Push", typeof(string)); - var messageParam = Expression.Parameter(typeof(string), "message"); + var pushMethodCall = Expression.Call(null, pushMethod, messageParam); return Expression.Lambda(pushMethodCall, messageParam).Compile(); } protected override OpenMdc GetOpenMdcMethod() { - var mdcContextType = Type.GetType("NLog.MappedDiagnosticsContext, NLog"); + var keyParam = Expression.Parameter(typeof(string), "key"); + var ndlcContextType = Type.GetType("NLog.NestedDiagnosticsLogicalContext, NLog"); + if (ndlcContextType != null) + { + var pushObjectMethod = ndlcContextType.GetMethod("PushObject", typeof(object)); + if (pushObjectMethod != null) + { + var mdlcContextType = Type.GetType("NLog.MappedDiagnosticsLogicalContext, NLog"); + if (mdlcContextType != null) + { + var setScopedMethod = mdlcContextType.GetMethod("SetScoped", typeof(string), typeof(object)); + if (setScopedMethod != null) + { + var valueObjParam = Expression.Parameter(typeof(object), "value"); + var setScopedMethodCall = Expression.Call(null, setScopedMethod, keyParam, valueObjParam); + var setMethodLambda = Expression.Lambda>(setScopedMethodCall, keyParam, valueObjParam).Compile(); + return (key, value, _) => setMethodLambda(key, value); + } + } + } + } + + var mdcContextType = Type.GetType("NLog.MappedDiagnosticsContext, NLog"); var setMethod = mdcContextType.GetMethod("Set", typeof(string), typeof(string)); var removeMethod = mdcContextType.GetMethod("Remove", typeof(string)); - var keyParam = Expression.Parameter(typeof(string), "key"); var valueParam = Expression.Parameter(typeof(string), "value"); - var setMethodCall = Expression.Call(null, setMethod, keyParam, valueParam); var removeMethodCall = Expression.Call(null, removeMethod, keyParam);