Добавление TraceListener в TraceSource, определенный в Config, не работает - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть источник трассировки, определенный в моем app.config. Недавно я наткнулся на этот пост от документы Microsoft . Я заметил, что они меняют фильтр для источника трассировки, определенного в конфиге.

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

private static TraceSource = new TraceSource("TraceSourceApp"); // this is the same source as the one in the app.config file

и затем моя ViewModel добавляет своего слушателя к источникам, которые определены в модели.

Проблема, которую я обнаружил, заключалась в том, что теперь, когда моя модель (которая также использовала ту же строку выше для создания источника) отслеживает событие, прослушиватель моего ViewModel не получает уведомления об этих событиях. Но если моя ViewModel использует источник и отслеживает другое событие, то это представление (которое имеет привязку к списку событий трассировки) отображает это событие.

Мой вопрос - почему? Разве две статические переменные не указывают на один и тот же TraceSource, потому что сейчас кажется, что это не так.

Примечание: в нем упоминается вызов метода Trace.Refresh () для сохранения изменений в файле конфигурации, но в моем коде я этого не делаю, так как не меняю источник, я просто добавляю слушателя .

namespace TraceSourceApp {
class Program {
    private static TraceSource mySource =
               new TraceSource("TraceSourceApp");
    private static ExtendedSource extendedTraceSource =
               new ExtendedSource("ExtentenedSourceApp", SourceLevels.All);
    static void Main(string[] args) {

        var source = mySource;
        //source = extendedTraceSource;

        Activity1(source);

        // Change the event type for which tracing occurs.  
        // The console trace listener must be specified   
        // in the configuration file. First, save the original  
        // settings from the configuration file.  
        EventTypeFilter configFilter =
            (EventTypeFilter)source.Listeners["console"].Filter;

        // Then create a new event type filter that ensures   
        // critical messages will be written.  
        source.Listeners["console"].Filter =
            new EventTypeFilter(SourceLevels.All);
        Trace.Refresh();
        Activity2(source);

        // Allow the trace source to send messages to listeners   
        // for all event types. This statement will override   
        // any settings in the configuration file.  
        source.Switch.Level = SourceLevels.All;

        // Restore the original filter settings.  
        source.Listeners["console"].Filter = configFilter;
        Activity3(source);
        source.Close();
        Temp.LogSomething();
        Console.ReadKey();
    }

    static void Activity1(TraceSource source) {
        source.TraceEvent(TraceEventType.Error, 1,
            "Error message.");
        source.TraceEvent(TraceEventType.Warning, 2,
            "Warning message.");
    }
    static void Activity2(TraceSource source) {
        source.TraceEvent(TraceEventType.Critical, 3,
            "Critical message.");
        source.TraceEvent(TraceEventType.Information, 4, "Informational message.");
    }
    static void Activity3(TraceSource source) {
        source.TraceEvent(TraceEventType.Error, 5,
            "Error message.");
        source.TraceInformation("Informational message.");
    }
}
public static class Temp {

    private static TraceSource mySource =
               new TraceSource("TraceSourceApp");

    private static ExtendedSource extendedTraceSource =
               new ExtendedSource("ExtentenedSourceApp", SourceLevels.All);

    public static void LogSomething() {
        mySource.TraceInformation("I should see this");
        extendedTraceSource.Listeners.Add(mySource.Listeners["console"]);
        extendedTraceSource.TraceInformation("I should see this");
    }
}

}

app.config:

<configuration>
<startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
<system.diagnostics>
  <sources>
    <source name="ExtentenedSourceApp" switchValue="All">
      <listeners>
        <add name="console" type="Ukadc.Diagnostics.Listeners.ConsoleTraceListener, Ukadc.Diagnostics" initializeData="{Source}::{Hour}:{Minute}:{Second}:{Millisecond}::{EventType}::{Message}" />
      </listeners>
    </source>

    <source name="TraceSourceApp"
      switchName="sourceSwitch"
      switchType="System.Diagnostics.SourceSwitch">
      <listeners>
        <add name="console"
          type="System.Diagnostics.ConsoleTraceListener">
          <filter type="System.Diagnostics.EventTypeFilter"
            initializeData="Warning"/>
        </add>
        <add name="myListener"/>
        <remove name="Default"/>
      </listeners>
    </source>

  </sources>
  <switches>
    <add name="sourceSwitch" value="Warning"/>
  </switches>
  <sharedListeners>
    <add name="myListener"
      type="System.Diagnostics.TextWriterTraceListener"
      initializeData="myListener.log">
      <filter type="System.Diagnostics.EventTypeFilter"
        initializeData="Error"/>
    </add>
  </sharedListeners>
</system.diagnostics>

Так что мой прослушиватель трассировки файлов, определенный в app.config, не видит сообщение I should see this, и я не понимаю, почему.

...