trace与代码跟踪服务
首先開篇引用《MVC2 2 in action》里面一段關(guān)于這個(gè)跟蹤服務(wù)的話
When you called Trace.Write() in Web Forms, you were interacting with the Trace- Context class. This exists on your ViewPage in ASP.NET MVC, but this isn't where you would want to write tracing statements. By the time you've passed the baton over to the view, there's no logic there that you'd need to trace. Instead, you'd like to trace the logic embedded in your controllers. You might try to leverage the TraceContext class in your controller, but these statements won't ever make their way to the list of messages in the trace log (on your page or on Trace.axd). Instead, you can use System.Diagnostics.Trace and set up your own TraceListeners to inspect the activity in your controllers. Alternatively, you can leverage a more mature logging framework such as log4net or NLog:
You debug ASP.NET MVC applications just as you would any .NET application. Tracing, however, doesn't offer as much for MVC. Instead, you can lean on the built-in TraceListeners in .NET, or utilize a good logging library like those mentioned earlier. Another aspect of error logging is health monitoring.
來自?<http://stackoverflow.com/questions/3328678/asp-net-mvc-tracing-issues>
當(dāng)你在WebForm中調(diào)用Trace.Write(),你正在和跟蹤上下文的類進(jìn)行交互。這些跟蹤信息存在于你的ASP.NET的ViewPage里面,但這并不是你期望輸出跟蹤語句的地方。等到你已經(jīng)把這些信息傳遞到View的時(shí)候,那里并沒有你需要的邏輯。反而你想將跟蹤邏輯植入到你的Controller里面。你或者嘗試在你的Controller里面使用TraceContext,但這些語句從不&*@#@@#(這里不會(huì)翻譯make their way)以消息列表的形式存在于跟蹤日志里面(或者在你的頁面或者在Trace.axd)。反而你可以使用System.Diagnostics.Trace來設(shè)置你自己的TraceLinteners以觀察你的Controller的活動(dòng)。或者你可以更改使用其他更成熟的框架,例如log4net 或者NLog;
就如你調(diào)試.NET?應(yīng)用程序一樣調(diào)試ASP.NET MVC應(yīng)用程序。但是跟蹤服務(wù)并沒有對(duì)MVC提供更多支持。你可以依靠.NET內(nèi)置的TraceListener或者利用上文提到的一些優(yōu)秀的日志庫。異常日志的另一方面的用途就是健康監(jiān)控。
? ?
小弟的英文水平確實(shí)不好,大學(xué)沒過四級(jí)。但至少發(fā)現(xiàn)Trace最好的應(yīng)用場景是WebForm里面,在ASP.NET MVC里面最好還是用其他方式了。所以看到這里對(duì)跟蹤服務(wù)沒興趣的同學(xué)可以出門轉(zhuǎn)左了。
? ?
那繼續(xù)看下來的同學(xué)都是對(duì)這個(gè)有興趣的。下面則直接出效果。
在一個(gè)ASP.NET WebForm的項(xiàng)目的配置文件中添加以下配置
然后隨便訪問一個(gè)WebForm頁面就會(huì)看到界面上多了一堆內(nèi)容
? ?
上面這個(gè)頁面只要多刷幾次,跟蹤信息就不會(huì)存在,因?yàn)楦櫽涗洿鎯?chǔ)的個(gè)數(shù)是有限的,默認(rèn)是10個(gè),可以在web.config/system.web/trace的requestLimit中設(shè)置。上面的圖我實(shí)際上省略來控件樹的內(nèi)容,被跟蹤的內(nèi)容還是不少,至少發(fā)現(xiàn)原來就算一個(gè)簡單的TextBox里面也包含來那么的子控件。下面則列舉一下被跟蹤的內(nèi)容
請(qǐng)求詳細(xì)信息:包含會(huì)話 ID,請(qǐng)求的時(shí)間,請(qǐng)求編碼,請(qǐng)求類型,狀態(tài)代碼,響應(yīng)編碼;
跟蹤信息:顯示頁級(jí)事件流。如果創(chuàng)建了自定義跟蹤消息,這些消息也將顯示在"跟蹤信息"部分。
控件樹:顯示有關(guān)在頁中創(chuàng)建的 ASP.NET 服務(wù)器控件的信息。
會(huì)話狀態(tài):顯示有關(guān)存儲(chǔ)在會(huì)話狀態(tài)中的值(如果有的話)的信息。
應(yīng)用程序狀態(tài):顯示關(guān)于存儲(chǔ)在應(yīng)用程序狀態(tài)中的值(如果有的話)的信息。這就是ApplicationState
Cookie 集合:顯示對(duì)于每個(gè)請(qǐng)求和響應(yīng)在瀏覽器與服務(wù)器之間傳遞的 Cookie 的有關(guān)信息。該部分既顯示持久性 Cookie,也顯示會(huì)話 Cookie。
標(biāo)頭集合:顯示關(guān)于請(qǐng)求和響應(yīng)消息的標(biāo)頭名稱/值對(duì)(提供關(guān)于消息體或所請(qǐng)求的資源的信息)的信息。就是頭部信息Header。
窗體集合:顯示名稱/值對(duì),這些名稱值/對(duì)顯示在 POST 操作(回發(fā))期間的請(qǐng)求中提交的窗體元素值(控件值)。就是往服務(wù)器提交表單元素的值。
Querystring 集合:顯示服務(wù)器相關(guān)的環(huán)境變量的集合和請(qǐng)求標(biāo)頭信息。
服務(wù)器變量:顯示服務(wù)器相關(guān)的環(huán)境變量的集合和請(qǐng)求標(biāo)頭信息。
? ?
對(duì)于<trace>配置節(jié)的屬性,如下所示
每個(gè)屬性的作用可以參考MSDN下的文檔
https://msdn.microsoft.com/zh-cn/library/6915t83k.aspx
實(shí)際上跟蹤信息可以通過Trace.axd(跟蹤查看器)去查看。跟蹤查看器的使用方式是如果應(yīng)用程序的URL?為http://localhost/SampleApplication?,請(qǐng)定位到http://localhost/SampleApplication/trace.axd?查看該應(yīng)用程序的跟蹤信息。也就是說當(dāng)前測試地址是http://localhost:8081,那想進(jìn)入跟蹤查看器查看的話就通過這個(gè)URL:http://localhost:8081/trace.axd。
在這里可進(jìn)入到每個(gè)具體的請(qǐng)求,內(nèi)容就有點(diǎn)類似于前面跟蹤信息的截圖。只是少了頁面的實(shí)際內(nèi)容。就是那幾個(gè)Label和TextBox。
跟蹤信息可以在頁面上輸出是因?yàn)檎{(diào)用了一個(gè)叫WebPageTraceListener的類,他是繼承TraceListener的一個(gè)子類。其余子類如下圖
凡是繼承了這個(gè)類的,都可以通過不同子類對(duì)應(yīng)的實(shí)現(xiàn)方式來輸出跟蹤信息。比如TextWriteRaceLintener它可以把跟蹤內(nèi)容輸出到一個(gè)txt文件中去。
可以通過這個(gè)小例子
在Global.asax中添加代碼
通過往跟蹤監(jiān)聽器集合中添加兩個(gè)監(jiān)聽器。
然后在頁面代碼中調(diào)用Trace輸出兩條跟蹤信息
假設(shè)不調(diào)用這個(gè)Flush方法,跟蹤信息不會(huì)輸出到文本中。
? ?
在ASP.NET MVC中,同樣調(diào)用Trace類去記錄一些跟蹤信息,結(jié)果會(huì)如何?
單純在Action方法中添加代碼,然后訪問對(duì)應(yīng)的URL
結(jié)果發(fā)現(xiàn)頁面上毛都沒有。進(jìn)入跟蹤查看器是能發(fā)現(xiàn)有一條跟蹤信息,進(jìn)去查看發(fā)現(xiàn)對(duì)比起WebForm的就少了控件樹和頁級(jí)事件流的跟蹤信息,Trace.Write的內(nèi)容應(yīng)該在顯示跟蹤信息一欄中。但是這個(gè)并沒有出現(xiàn)。由此也證明了對(duì)跟蹤服務(wù)的配置在WebForm和MVC中已有差別。為了能讓跟蹤信息在頁面上顯示,需要手動(dòng)添加一個(gè)Listener。即時(shí)這樣,也只能在跟蹤查看器中查看到Trace輸出的內(nèi)容,并不能在原有頁面上看到跟蹤信息,就是trace配置節(jié)的pageOutput已失效。
確實(shí)這個(gè)跟蹤服務(wù)到現(xiàn)在來說確實(shí)會(huì)遭淘汰了,像通過Trace.Write這樣輸出跟蹤信息可以通過寫日志的形式取代,查看請(qǐng)求頭,Cookie等跟請(qǐng)求相關(guān)的可以通過瀏覽器的開發(fā)人員工具去查看。但如果懶得去看按F12去打開開發(fā)人員工具和遠(yuǎn)程到服務(wù)器去打開日志文件的,還是可以把這個(gè)跟蹤服務(wù)啟用。
最后特別鳴謝china autumn對(duì)少部分譯文作了校對(duì)工作。非常感謝。
轉(zhuǎn)載于:https://blog.51cto.com/zhanglida66/1920874
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的trace与代码跟踪服务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: apache ab压力测试报错apr_s
- 下一篇: 《JavaScript面向对象编程指南》