我最近一直在使用nLog将其他日志记录添加到我们的某个Web应用程序中。一切都很顺利,除非我们想在我们的测试环境中捕获文件名和行号以帮助调试。我以为我得到了答案:layout="${stacktrace:format=raw}"
虽然看起来它可能在某些情况下起作用,但它并没有在我的测试中。它产生了以下输出:
InvokeActionMethodFilterAsynchronouslyRecursive at offset 177 in file:line:column <filename unknown>:0:0
OnActionExecuting at offset 52 in file:line:column <filename unknown>:0:0
CheckAccess at offset 1514 in file:line:column <filename unknown>:0:0
请注意,文件名是&#34;未知&#34;并且行号和列号为0。
我仔细检查了我是否处于调试模式,当我检查异常时,我可以看到标准的.NET堆栈跟踪,它有文件名和行号:
at [REDACTED].CheckAccess(ActionExecutingContext& filterContext) in [REDACTED]\\attribute.cs:line 92
这是我的nLog.config文件:
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="true"
throwExceptions="true"
internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
<variable name="InstanceURL" value="localhost"/>
<targets>
<target
name="MainLog"
xsi:type="Database"
connectionStringName="docsdb"
commandText="insert into ErrorLog(Message,StackTrace,InnerExceptionMessage,DateOccurred,UserName, InstanceURL) values( @message, @stacktrace, @log_exception,@time_stamp,@user_name,@instance_url);"
>
<parameter name="@time_stamp" layout="${date:format=yyyy-MM-ddTHH\:mm\:ss.fff}"/>
<parameter name="@message" layout="${message}"/>
<parameter name="@user_name" layout="${windows-identity:domain=true}"/>
<parameter name="@log_exception" layout="${exception:format=ToString}"/>
<parameter name="@stacktrace" layout="${stacktrace:format=raw}"/>
<parameter name="@instance_url" layout="${var:InstanceURL}"/>
</target>
</targets>
<rules>
<logger name="*" minlevel="Info" writeTo="MainLog" />
</rules>
</nlog>
我的问题是:
1)我是否正确配置堆栈跟踪?
2)有没有办法记录&#34; .Net风格&#34;堆栈跟踪?我更喜欢更冗长的.NET堆栈跟踪。
修改 这与丢失的PDB文件无关。包含PDB,如果我手动登录(在nlog之外)异常,堆栈跟踪包括文件名和行号。我试图弄清楚我需要做些什么来让nLog包含它们。感谢。