Подтвердить что ты не робот

Трассировка .NET в файл не работает

Я пытаюсь отслеживать странные вещи, происходящие в моем приложении Windows Forms, с помощью TextWriterTraceListener, указывающего на расположение файла. Я настроил его так, что в первый раз, когда приложение должно отслеживать что-то во время запуска программы, оно создает прослушиватель трассировки и регистрирует его.

Однако, похоже, что файл трассировки вообще не создается, ничего не появилось в C:\GMS2Trace.log. Я проверил, что программа достигла части кода, вызывающего метод трассировки.

Мой код трассировки выглядит следующим образом:

internal static void traceWarning(string message)
{
    if (!traceEnabled)
    {
        traceEnabled = true;
        Trace.Listeners.Add(new TextWriterTraceListener(@"C:\GMS2Trace.log"));
    }

    Trace.TraceWarning(getTimeStamp() + " " + message);
}

Это проблема с расположением файла трассировки или что-то еще?

4b9b3361

Ответ 1

Вы можете настроить все это из app.config и просто использовать:

Trace.Writeline("msg");

Пример из одного из моих проектов:

<system.diagnostics>
  <trace autoflush="true" indentsize="4">
    <listeners>
      <add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="log.log" />
      <remove name="Default" />
    </listeners>
  </trace>
</system.diagnostics>

Помните, что все Console.Writeline также попадает в файл

Ответ 2

Добавить

Trace.AutoFlush = true;

после добавления слушателя

Ответ 3

Вам нужно настроить уровень трассировки в файле app.config

<system.diagnostics>
   <switches>
      <!-- This switch controls data messages. In order to receive data 
         trace messages, change value="0" to value="1" -->
      <add name="DataMessagesSwitch" value="0" />
      <!-- This switch controls general messages. In order to 
         receive general trace messages change the value to the 
         appropriate level. "1" gives error messages, "2" gives errors 
         and warnings, "3" gives more detailed error information, and 
         "4" gives verbose trace information -->
      <add name="TraceLevelSwitch" value="0" />
   </switches>
</system.diagnostics>

И скомпилируйте с включенной трассировкой csc.exe /d:TRACE или добавив #define TRACE в начало файла

Ответ 4

Вам также необходимо убедиться, что константа TRACE определена при создании проекта:

Screenshot of the TRACE constant setting

По умолчанию это отключено для конфигурации Release, что означает, что вызов Trace.TraceWarning полностью оптимизирован.

Ответ 5

Вы можете сделать это в коде:

string traceFileLocation = "yourFileName";
TraceSource traceSource;
TextWriterTraceListener traceListener;
traceSource = new TraceSource("your source name");
traceListener = new TextWriterTraceListener(traceFileLocation);
traceListener.TraceOutputOptions = TraceOptions.LogicalOperationStack | 
                                    TraceOptions.DateTime | 
                                    TraceOptions.Timestamp | 
                                    TraceOptions.ProcessId | 
                                    TraceOptions.ThreadId;
traceSource.Switch = new SourceSwitch("someName","some Name");
traceSource.Switch.Level = SourceLevels.Information;
traceSource.Listeners.Clear();
traceSource.Listeners.Add(traceListener);
Trace.AutoFlush = true;

Trace.CorrelationManager.StartLogicalOperation("logical operation");
traceSource.TraceEvent(TraceEventType.Error, (int)TraceEventType.Error, "messsage");
Trace.CorrelationManager.StopLogicalOperation();

Ответ 6

Что случилось со мной, у меня не было прав на запись в каталог, в котором я настроил свой файл журнала.
Фактически Trace записывал из приложения COM +, работающего под управлением LocalService, и у этого пользователя не было прав на целевую папку.
Исключение было прозрачно (для программы), проглоченное слушателем, и я понял только, что, когда Visual Studio продемонстрировала исключение в окне вывода после попытки записи первой строки трассировки.
Изменение идентификатора для пользователя с разрешениями или добавление разрешений в LocalService в целевую папку сделало трюк для меня.