NLog中不完整的堆栈跟踪

时间:2015-10-19 15:30:30

标签: c# nlog

我在应用中实施NLog。日志所执行的数据库插入的配置包括此...

<parameter layout="${stacktrace:format=Raw}" name="@Stacktrace"/>

但是当写入日志项时,输出总是看起来像这样......

  

文件中偏移量为85的MethodName1:行:列:0:0

     

文件中偏移量为93的MethodName2:行:列:0:0

     

文件中偏移量为160的MethodName3:行:列:0:0

有人可以建议为什么缺少文件名和位置详细信息吗?

2 个答案:

答案 0 :(得分:0)

如果您希望NLog显示文件名和行号,请​​务必将生成调试信息设置为完整仅限pdb Advanced Compiler Settings对话框。

答案 1 :(得分:0)

您的${stacktrace}是否包含任何有用的信息?例如,假设一个非常简单的程序,堆栈跟踪在StackTraceLayoutRenderer执行它之前看起来就像这样。

logEvent.StackTrace.GetFrames()
{System.Diagnostics.StackFrame[14]}
    [0]: {Write at offset 263 in file:line:column c:\Dev\NLogSrc\src\NLog\LoggerImpl.cs:76:17    }
    [1]: {WriteToTargets at offset 161 in file:line:column c:\Dev\NLogSrc\src\NLog\Logger.cs:542:13    }
    [2]: {Debug at offset 103 in file:line:column c:\Dev\NLogSrc\src\NLog\Logger1.cs:454:17    }
    [3]: {Build at offset 232 in file:line:column c:\Dev\NLogSrc\src\ConsoleApplication1\Program.cs:43:17    }
    [4]: {GetAnother at offset 77 in file:line:column c:\Dev\NLogSrc\src\ConsoleApplication1\Program.cs:25:17    }
    [5]: {Main at offset 85 in file:line:column c:\Dev\NLogSrc\src\ConsoleApplication1\Program.cs:16:13    }
    [6]: {_nExecuteAssembly at offset 0 in file:line:column <filename unknown>:0:0    }
    [7]: {ExecuteAssembly at offset 107 in file:line:column <filename unknown>:0:0    }
    [8]: {RunUsersAssembly at offset 40 in file:line:column <filename unknown>:0:0    }
    [9]: {ThreadStart_Context at offset 112 in file:line:column <filename unknown>:0:0    }
    [10]: {RunInternal at offset 180 in file:line:column <filename unknown>:0:0    }
    [11]: {Run at offset 22 in file:line:column <filename unknown>:0:0 }
    [12]: {Run at offset 65 in file:line:column <filename unknown>:0:0 }   
    [13]: {ThreadStart at offset 68 in file:line:column <filename unknown>:0:0    }

如果你看了第5项(我的代码)和第6项(运行时间(?)),那就有很大的不同

enter image description here

此渲染器默认为堆栈中的第一个项目,它不是源自NLog(#3)而TopFrames配置项默认为3,所以我希望您的第一行有一些信息有价值的,而其他的可能会或可能不会。

在您的日志记录调用之前设置断点可能值得,并在您的即时窗口中尝试new System.Diagnostics.StackTrace(true).GetFrames(),看看有什么值与您看到的值相比。