Проблема с System.Diagnosis.TextWriterTraceListener, не записывающим какой-либо журнал в файловую систему - PullRequest
8 голосов
/ 28 января 2010

Чтобы решить проблему с отправкой электронной почты через 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-сервером. Однако в производственной среде (работающей на IIS 6 в Windows 2003 Server) она вообще не работает. Никакой журнал не записывается в файловую систему. Сначала я подумал, что, возможно, учетная запись рабочего процесса ASP.NET (NETWORK SERVICE) не имеет достаточных прав для записи в файловую систему в указанном месте. Я исправил это, но до сих пор не получил лог. Во-вторых, я подумал, что, возможно, папка настроена на «только чтение» и исправил это. Но все равно я не пишу логи.

У кого-нибудь есть идея, в чем может быть проблема? Или, может быть, какой-нибудь совет, как я могу это исправить? Спасибо заранее!

Ответы [ 5 ]

3 голосов
/ 07 февраля 2010

Прежде всего, я бы проверил, работает ли трассировка, ничего не записывая в файловую систему. То есть я бы просто использовал обычную трассировку Windows. Чтобы просмотреть вывод трассировки, я бы использовал DebugView Windows Sysinternals . Конечно, возможно, вам следует изменить свой конфигурационный файл, я не очень знаком с синтаксисом.

Теперь, если все отлично работает для обеих сред (разработки и производства), чтобы вы могли просматривать сообщения трассировки в средстве просмотра, тогда проблема больше сосредоточена на файловой системе и сохранении журнала.

Куда, по вашему мнению, сохранен ваш лог-файл? Может быть, это другое место, когда речь идет о производственной среде. Я думаю, что в Windows Server 2003 вы должны искать свой файл где-то под WinDir, а не в папке (папках) веб-приложения.

Когда дело доходит до отладки таких проблем, я бы передавал учетную запись IIS локальному администратору / администратору домена, чтобы посмотреть, решена ли проблема или нет. Если это решено, то здесь проблема с разрешениями.

Удачи!

2 голосов
/ 07 февраля 2010

Я бы начал с добавления полного пути в атрибут initializeData:

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

Если необходимо, убедитесь, что ваше приложение имеет доступ для записи по этому пути, добавив тестовую страницу, которая создает файл в том же каталоге.

Когда вы используете относительный путь, как в текущей конфигурации, я считаю, что он будет относиться к корневому каталогу приложения при работе в IIS. Но при работе под Cassini на компьютере разработчика это не будет так - IIRC будет относиться к% WINDIR% \ System32, но я бы не стал полагаться на это.

2 голосов
/ 01 февраля 2010

Это один и тот же билд в разработке и производстве? Часто константа условной компиляции TRACE не определяется в режиме выпуска. Тогда никакой трассировки не появится.

1 голос
/ 05 июня 2015

Моя проблема заключалась в том, что константа TRACE не была определена в зависимом проекте, поэтому, даже если она была установлена ​​в основном проекте, она все равно не будет регистрироваться. После того, как я добавил константу TRACE в зависимый проект, она заработала как ожидалось.

1 голос
/ 05 февраля 2010

Вы пытались использовать Process Monitor , чтобы проверить, записывается ли файл System.Net.trace.log или возникла ошибка при его создании? Возможно ли, что он просто записывается в странное место, которое вам не нужно (я считаю, что по умолчанию должен быть текущий рабочий каталог рабочего процесса ASP.NET).

...