Asp.NET的Trace追踪

Posted 吴晓阳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Asp.NET的Trace追踪相关的知识,希望对你有一定的参考价值。

当我们扑捉程序错误时,调试器是开发者们最得力的助手。
然而,ASP.NET的跟踪,在调试时是一个很棒的不容忽视的辅助,它允许你的ASP.NET代码在执行期间输出消息,提供有用信息有效帮助你发现问题所在。

调试器和跟踪这两个技术有一点区别。
调试器是一种自然的交互技术它依赖于你有能力暂停程序执行并检查当前的状态。
而跟踪是一种不干扰系统运行,简单的输出代码设定的跟踪信息(类似于经典的“printf”式调试),在执行结束时,你可以取得跟踪代码产生的输出并分析它。

ASP.NET跟踪子系统通过控件,页面或者可以增加自身跟踪输出的组件显露出一个API,可以输出任何可用到的信息给你一些有意义的帮助。
在ASP.NET中,跟踪与页面和运行时紧密的整合在一起。

可以通过

<%@ Page Trace="true"

在单独的某页上启用跟踪,这种情况下跟踪信息作为页面的一部分发送给浏览器来显示。

也可以修改web.config中

<trace enabled="true">

启用整站的跟踪,通过 http://网站/Trace.axd 就可以进行追踪访问。

跟踪作为一个子系统构建为ASP.NET的一个基础结构,给应用程序提供诊断信息关于某个单独请求。
通过跟踪,你可以分析浏览器和WEB服务器交换的数据,包括请求的详细信息,时间调配信息,服务器变量,Cookies,头信息,Session状态等等。

代码添加Trace机制

//在Page或其继承类中
Trace.Write("Your message");

//ASP.NET 应用程序的任意地方,通过HttpContext的Trace属性显露TraceContext类的一个实例给开发者
HttpContext.Current.Trace.Write("Your message");

TraceContext类还有一个Warn方法,跟Write不同的是它将文本呈现为红色。Write和Warn都有一些重载方法:

// Write overloads重载
public void Write ( String message )
public void Write ( String category , String message )
public void Write ( String category , String message , Exception errorInfo )
  
// Match Warn overloads
public void Warn ( String message )
public void Warn ( String category , String message )
public void Warn ( String category , String message , Exception errorInfo )

第一个重载将跟踪消息写入跟踪日志。
第二个重载接受跟踪类别和跟踪内容,跟踪类别可以使用简短的跟踪信息,也可以是任何对应用程序或消息有用的字符串。
第三个重载将跟踪信息写入跟踪日志,包括用户定义的所有类别、跟踪消息和错误信息。跟踪日志不接受html格式,文本在呈现到浏览器之前转义。

例如:

Trace.Warn("跟踪分类", "跟踪信息",new Exception("出错了,数据对象为空"));

显示为:

TraceContext类其他两个属性:
IsEnabled属性 是布尔类型,表示当前 Web 请求是否启用跟踪。
TraceMode属性 设置跟踪消息输出的排序顺序,一个枚举类型,包含SortByCategory(分类) 和 SortByTime(时间)。 

可以编写程序设置IsEnable来启用跟踪。

在ASP.NET 2.0中,也可以使用新的属性Page类的TraceEnabled,该属性仅仅是对Trace.IsEnabled的包装。

    public class Page : TemplateControl, IHttpHandler
    {
        //     设置一个值,该值指示是否为 System.Web.UI.Page 对象启用跟踪。
        //     如果为该页启用跟踪,则为 true;否则为 false。默认值为 false。
        [Browsable(false)]
        [EditorBrowsable(EditorBrowsableState.Never)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public bool TraceEnabled { get; set; }
        //     设置跟踪语句在页中的显示模式。
        //     System.Web.TraceMode 枚举成员之一。
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        [Browsable(false)]
        [EditorBrowsable(EditorBrowsableState.Never)]
        public TraceMode TraceModeValue { get; set; }

……

}

ASP.NET 2.0中web.config配置如下:

<trace
   enabled="true|false"
   localOnly="true|false"
   mostRecent="true|false"
   pageOutput="true|false"
   requestLimit="integer"
   traceMode="SortByTime|SortByCategory"
   writeToDiagnosticsTrace="true|false" />

ASP.NET内建的跟踪查看器--trace.axd,

Trace.axd是一个系统定义的HTTP handler,获取内部跟踪信息的缓存并显示到Web接口。

通过请求 应用程序根目录下的trace.axd(http://网站/Trace.axd) 访问跟踪查看器,

也可以给页面请求增加id=xxx参数 (http://网站/Trace.axd?id=0开始)来直接访问某个指定跟踪信息。

注意:
1. 属性enabled
通过enabled="true"激活trace.axd工具,但是不激活 跟踪信息作为页面的一部分 进行输出。
这样可以启用追踪不影响用户页面的输出。
这样做使得你可以在产品中打开跟踪却不影响用户页面的输出。原因见(2属性pageOutput)
如:
<trace enabled="true" />
2.属性pageOutput 表示是否在任意页中显示跟踪输出
默认false,这样配置
<trace enabled="true" pageOutput="false" />
可以省略pageOutput="false" 。

 

 

所有的跟踪信息被TraceContext类缓存在一个DataSet对象中,
当应用程序的AppDomain的HttpRuntime对象首次被初始化时,
TraceContext类将被实例化。
结果是当trace.axd被启用时,维护的跟踪信息越多,内存方面的消耗越多。

ASP.NET 2.0的一个新特性是允许使用TraceContext.TraceFinished事件,
在收集完所有请求信息后被引发。
TraceFinished处理程序提供了一个TraceFinishedEventArgs参数接受跟踪消息(TraceRecord)对象集合。
每一条存储了一个单独的ASP.NET跟踪消息和所有相关数据,
允许你采集这些信息并随意进行处理,
显示到页面或者记录到自己的数据库等等 。

 

 

ASP.NET下的跟踪跟.NET Framework直接相关,Systems.Diagnostics命名空间定义了两个类: Trace 和 Debug. 
它们提供了对代码进行跟踪的常用方法。
Trace 和 Debug类本质相同,都工作在很多特定模块之上例如侦听器。

侦听器搜集并将消息存储到Windows事件日志,文本文件,或者其他类似文件中。
每个应用程序可以有它自己的一套侦听器;
所有注册过的侦听器接受全部的发布消息。
ASP.NET 2.0中跟踪子系统被进一步加强,可以转发ASP.NET跟踪信息给任意一个已注册的.NET跟踪侦听器。
通过打开web.config文件 <trace> 节的writeToDiagnosticsTrace属性启用这一特性,
如下所示:
<trace enabled="true" pageOutput="false"  writeToDiagnosticsTrace="true" />
不过仅设置writeToDiagnosticsTrace属性还不行,还需要给程序注册一个或多个侦听器。
可以通过<system.diagnostics> 节中的<trace>节实现,
例如:
<system.diagnostics>
  <trace autoflush="true">
    <listeners>
      <add name="myListener" 
           type="System.Diagnostics.TextWriterTraceListener" 
           initializeData="c:\\myListener.log" />
    </listeners>
  </trace>
</system.diagnostics>
这里有两件事要注意:
第一,只有文本才能通过Write或Warn传递给侦听器,也就是说,侦听器不会存储一个标准的ASP.NET跟踪信息,而仅是跟踪信息块的内容。
第二,你可以编写自定义的侦听器来发送跟踪信息到你选择的介质--例如SQL Server 数据库,你所要做的仅是继承System.Diagnostics.TraceListener并重载一些方法。
然后,
将新类注册到要跟踪的WEB应用程序的web.config文件中。
(更多关于编写自定义TraceListener请查阅msdn.microsoft.com/msdnmag/issues/06/04/CLRInsideOut.)

有一件有趣的事值得注意,ASP.NET 2.0中System.Web.dll新加了一个源自TraceListener的类型WebPageTraceListener,它与writeToDiagnosticsTrace配套使用。
当WebPageTraceListener实例增加到跟踪侦听器集合后,写入 .NET Trace 日志的跟踪消息也将写入ASP.NET Trace日志。

最后,在ASP.NET 2.0中跟踪相关的还有一个新的<deployment>节被增加到 Web configuration 节中。
<deployment retail="true|false" />
当 Retail 为 true 时,ASP.NET 将禁用在配置中定义的某些设置,如跟踪输出、自定义错误和调试能力。
<deployment>节只可以在machine.config中设置。
【译者:本节仅适用于计算机级别和应用程序级别的配置文件。】 

以上是关于Asp.NET的Trace追踪的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 中的 dotnet-trace 不显示控制器的任何方法

ASP.NET 生命周期 – ASP.NET 应用生命周期

从托管为 Azure Web App 的 ASP.NET 5 应用程序记录日志

与 Azure Application Insights、ASP.NET MVC 和 NLog 的活动关联

ASP.NET Core MVC 中的慢速显示性能

ASP.NET MVC 5 Azure App ZAP Scan 指示代理披露漏洞 - 我们如何防止这种情况发生?