.net System.Diagnosis.TextWriterTraceListener未将任何日志写入文件系统时出现问题

.net System.Diagnosis.TextWriterTraceListener未将任何日志写入文件系统时出现问题,.net,asp.net,logging,system.diagnostics,.net,Asp.net,Logging,System.diagnostics,为了解决通过smtp服务器发送电子邮件时无法发送电子邮件的问题,建议我使用System.Diagnosis.TextWriterTraceListener启用日志记录,以跟踪与smtp服务器的通信以跟踪任何错误。我在节点下的web.config中添加了以下内容: <system.diagnostics> <trace autoflush="true" /> <sources> <source name="Syste

为了解决通过smtp服务器发送电子邮件时无法发送电子邮件的问题,建议我使用System.Diagnosis.TextWriterTraceListener启用日志记录,以跟踪与smtp服务器的通信以跟踪任何错误。我在节点下的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服务器的完整通信。但是,在生产环境中(在Windows2003Server的IIS6上运行),它根本不起作用。没有日志写入文件系统。我的第一个想法是,可能ASP.NET工作进程帐户(网络服务)没有足够的权限在指定位置写入文件系统。我修好了,但还是没有日志。其次,我认为文件夹可能被设置为“只读”,并且也修复了这个问题。但我还是没有写日志


有人知道问题出在哪里吗?或者是关于如何解决这个问题的一些建议?先走一步

开发和生产过程中的内置功能是否相同?在发布模式下,通常不定义跟踪条件编译常量。然后将不会显示任何跟踪。

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

首先,我要检查跟踪是否在没有向文件系统写入任何内容的情况下实际工作。也就是说,我只会使用常规的windows跟踪。为了查看跟踪输出,我将使用。当然,也许您应该更改配置文件,我对语法不太熟悉

现在,如果在两种环境(开发和生产环境)下都能正常工作,这样您就可以在查看器中查看跟踪消息,那么问题更多地集中在文件系统和日志保存上

您认为您的日志文件保存到哪里?当涉及到生产环境时,它可能是一个不同的位置。我认为在WindowsServer2003上,您应该在WinDir下的某个位置查找文件,而不是在web应用程序的文件夹中

在调试此类问题时,我会将IIS帐户升级到本地/域管理员,以查看问题是否得到解决。如果问题解决了,这里就有权限问题


祝你好运

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

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

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


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

我的问题是跟踪常量未在依赖项目中定义,因此即使在主项目中设置,也不会记录。一旦我将跟踪常数添加到依赖项目中,它就如预期的那样工作。

是的,它在开发和生产中都是相同的。我还通过在完全相同的版本上但在不同的生产环境中启用跟踪进行了验证,在那里它工作得很好。谢谢你的提示!就记录而言,似乎您错了,Microsoft实现将检查initializeData中提供的路径是否是相对路径@奥斯卡-一个有趣的博客指出,某位微软工程师今天过得很糟糕。但是提议的“MungeFileName”解决方案可以被更简单的“Path.Combine(AppDomain.CurrentDomain.BaseDirectory,fileName)”替代。Combine方法足够聪明,可以处理第二个参数本身是绝对路径的情况。