System.Diagnostics.TextWriterTraceListener没有将任何日志写入文件系统的问题

时间:2010-01-28 13:32:43

标签: .net asp.net logging system.diagnostics

要解决通过未发送电子邮件的smtp-server发送电子邮件的问题,我建议使用System.Diagnosis.TextWriterTraceListener启用日志记录,以跟踪与smtp-server的通信以跟踪任何错误。我将以下内容添加到节点下的web.config中:

<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-server的完整通信。但是,在生产环境(在Windows 2003 Server中的IIS 6上运行)中,它根本不起作用。没有日志写入文件系统。我的第一个想法是,ASP.NET工作进程帐户(NETWORK SERVICE)可能没有足够的权限写入指定位置的文件系统。我修好了,但仍然没有记录。其次,我认为文件夹可能设置为“只读”并修复了该文件夹。但我仍然没有写日志。

有人知道问题可能是什么吗?或者也许就如何解决这个问题提出一些建议? Thanx提前!

5 个答案:

答案 0 :(得分:3)

首先,我会检查跟踪是否真正有效,而无需向文件系统写入任何内容。也就是说,我只是使用常规的Windows跟踪。为了查看跟踪输出,我使用Windows Sysinternals' DebugView。当然,也许您应该更改配置文件,我不熟悉语法。

现在,如果一切都适用于两种环境(开发和生产),以便您可以在查看器中查看跟踪消息,那么问题就更集中在文件系统和日志保存上。

您认为您的日志文件保存在哪里?在生产环境方面,它可能是一个不同的位置。我认为在Windows Server 2003上,您应该在WinDir下的某个地方查找您的文件,而不是在Web应用程序的文件夹中查找。

在调试此类问题时,我会将IIS帐户升级为本地/域管理员,以查看问题是否已解决。如果它已经解决,那么这里有一个权限问题。

祝你好运!

答案 1 :(得分:2)

它是否与开发和生产相同?通常,TRACE条件编译常量未在发布模式中定义。然后就不会出现任何追踪。

答案 2 :(得分:2)

我首先在initializeData属性中放置一个完全限定的路径:

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

如有必要,请通过添加在同一目录中创建文件的测试页来验证您的应用是否具有该路径的写入权限。

当您在当前配置中使用相对路径时,我相信它在IIS下运行时将相对于应用程序的根目录。但是当在开发机器上运行Cassini时,情况并非如此 - IIRC它将相对于%WINDIR%\ System32,但我不会依赖它。

答案 3 :(得分:1)

您是否尝试过使用Process Monitor来查看是否正在编写System.Net.trace.log文件,或者创建它时是否有错误?是否有可能只是写入你不想要的奇怪的地方(我相信默认应该是ASP.NET工作进程的当前工作目录)。

答案 4 :(得分:1)

我的问题是TRACE常量没有在依赖项目中定义,所以即使它是在主项目中设置的,它仍然不会记录。一旦我将TRACE常量添加到依赖项目,它就按预期工作。