2010-01-28 85 views
8

要解決通過smtp服務器發送電子郵件沒有發送電子郵件的問題,我建議使用System.Diagnosis啓用日誌記錄.TextWriterTraceListener跟蹤與smtp服務器的通信以跟蹤任何錯誤。我添加了以下內容到我的web.config節點下:System.Diagnosis.TextWriterTraceListener問題沒有寫任何日誌到文件系統

<system.diagnostics> 
     <trace autoflush="true" /> 
     <sources> 
     <source name="System.Net" > 
      <listeners> 
      <add name="MyTraceFile"/> 
      </listeners> 
     </source> 

     <source name="System.Net.Sockets"> 
      <listeners> 
      <add name="MyTraceFile"/> 
      </listeners> 
     </source> 
     </sources> 

     <sharedListeners> 
     <add 
      name="MyTraceFile" 
      type="System.Diagnostics.TextWriterTraceListener" 
      initializeData="System.Net.trace.log"    /> 
     </sharedListeners> 

     <switches> 
     <add name="System.Net" value="Verbose" /> 
     <add name="System.Net.Sockets" value="Verbose" /> 
     </switches> 
    </system.diagnostics> 

我在我的開發機器上試過了,它工作得很好!我可以輕鬆地讀出與smtp服務器的完整通信。但是,在生產環境中(在Windows 2003 Server的IIS 6上運行),它根本不起作用。沒有日誌正在寫入文件系統。我的第一個想法是ASP.NET工作進程帳戶(NETWORK SERVICE)可能沒有足夠的權限寫入指定位置的文件系統。我修正了這個問題,但仍然沒有記錄。其次,我認爲可能該文件夾被設置爲「只讀」並修復。但是我仍然沒有寫日誌。

不要任何人有一個想法,這個問題可能是什麼?或者,我可以怎樣解決這個問題呢?感謝提前!

回答

3

首先,我會檢查跟蹤實際工作沒有任何內容寫入文件系統。也就是說,我只是使用常規的窗口跟蹤。爲了查看跟蹤輸出,我使用Windows Sysinternals' DebugView。當然,也許你應該改變你的配置文件,我不太熟悉語法。現在

,如果一切正常的兩種環境(開發和生產),這樣就可以在查看器查看跟蹤消息,則問題更集中在文件系統和日誌進行保存。

你認爲你的日誌文件保存在哪裏?當涉及到生產環境時,也許它是一個不同的位置。我認爲,在Windows Server 2003上,您應該在WinDir下找到您的文件,而不是在Web應用程序的文件夾中。

當涉及到調試這樣的問題,我想升級的IIS的帳戶本地/域管理員只是爲了看看問題解決與否。如果解決了,那麼這裏有一個權限問題。

祝你好運!

2

它在開發和生產中是否一樣?通常情況下,TRACE條件編譯常量在發佈模式下沒有定義。然後不會出現跟蹤。

+0

是的,它在開發和生產中都是一樣的。我還通過在完全相同的版本上啓用跟蹤來驗證,但是在不同的生產環境中,並且在那裏工作得很好。謝謝你的提示! – 2010-02-01 14:48:13

1

您是否嘗試過使用Process Monitor,看是否System.Net.trace.log文件正被寫入或者是否有創建一個錯誤呢?有可能它只是寫到一個你不想找的奇怪的地方(我相信默認應該是ASP.NET工作進程的當前工作目錄)。

2

我將通過把一個完全合格的路徑在initializeData屬性開始:

<add 
     name="MyTraceFile" 
     type="System.Diagnostics.TextWriterTraceListener" 
     initializeData="c:\SomePath\System.Net.trace.log"     
/> 

如果有必要,驗證您的應用程序有加,在同創建一個文件測試頁寫訪問該路徑目錄。

當您使用作爲當前的配置,相對路徑,我相信IIS下運行時,這將是相對於應用程序的根目錄。但是當在開發機器上運行在Cassini下時,情況並非如此 - IIRC它將與%WINDIR%\ System32相關,但我不會依賴這一點。

+0

僅用於記錄,看起來你錯了,Microsoft實現將檢查initializeData中提供的路徑是否相對。 http://nicholas.piasecki.name/blog/2009/03/on-textwritertracelistener-inheritance-initializedata-aspnet-and-paths/ – Oscar 2014-09-30 08:48:46

+0

@Oscar - 有趣的博客指出,一些微軟工程師在糟糕的一天。但是建議的「MungeFileName」解決方案可以用簡單的「Path.Combine(AppDomain.CurrentDomain.BaseDirectory,fileName)」替代。 Path.Combine方法足夠聰明,可以處理第二個參數本身就是絕對路徑的情況。 – Joe 2014-09-30 10:03:01

1

我的問題是TRACE常量沒有在依賴項目中定義,所以即使它在主項目中設置,它仍然不會記錄。一旦我將TRACE常量添加到從屬項目中,它就按預期工作。