将行号添加到在发布模式下部署的ASP.NET网站的堆栈跟踪

我正致力于维护一个Web应用程序,该网站也具有错误日志function。

我的客户偶尔在网站上遇到一些问题,该问题也记录在错误日志文件中,但它只显示了在堆栈跟踪中发生exception的方法调用层次结构。

当我在Dev环境堆栈上显式引发exception时,exception的跟踪显示方法调用层次结构及其实际exception发生的行号。

我知道在生产中我们只部署DLL,这就是我们没有在日志文件中获取错误行号的原因。

任何人都有任何想法如何只在我们部署DLL(程序集)时才能获得错误行号?

在构建设置中,将项目设置为在发布模式下生成调试符号(pdb:s)。 如果生成它们,它们将自动包含在部署中。 无需在调试模式下运行整个站点,只需要可用的调试符号即可。

该设置位于项目的属性中。 选择发布时使用的构建配置。 然后在Build选项卡上,按Advanced...按钮并将调试信息设置为“Full”。

Anders Abel之前的回答非常适合您的需求。 不过我想添加一个更多架构驱动的方法,即重构你的日志引擎以使用C#5.0中新的Caller Information属性。

例如,您可以使用此方法记录exception

 public static void NDLogException(Exception ex, [System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "", [System.Runtime.CompilerServices.CallerMemberName] string memberName = "", [System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0) 

编译器将使用相应的值推断并填充默认参数。 CallerLineNumber属性是您专门寻找的属性。

当然,这需要您更改代码(假设您可以使用)

有关调用者信息属性的更多信息,请阅读此处

这是c#5中的新function,您可以这样做:

 public class LogManager { public void LogException(Exception exc, [CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0) { Trace.WriteLine(string.Format("Date: {0}", DateTime.Now)); Trace.WriteLine(string.Format("Exception: {0}", exc.Message)); Trace.WriteLine(string.Format("Occured in: {0}", memberName)); Trace.WriteLine(string.Format("source file path: {0}", sourceFilePath)); Trace.WriteLine(string.Format("source line number: {0}", sourceLineNumber)); } }