czwartek, 7 maja 2009

Śledzimy w .NET dalej (dzisiaj uruchomimy własny podsłuch)

Być może tytuł trochę zadziwiający, ale już zaraz wszystko się wyjaśni. Ten artykuł jest kontynuacją wcześniejszego artykułu pod tytułem: "Śledzenie i logowanie zdarzeń (tracing and logging) na platformie .NET" - dlatego w tytule dalej, a co z tym podsłuchem? ... mhmmm... dziś opiszę jak stworzyć własnego Listener’a.

A więc do dzieła...

Założenia - tworzymy aplikację konsolową, której nazwa assembly to "MyApplication" (nazwa assembly jest ważna - zapamiętajmy ją). Aplikacja ma dostarczać własnego TraceListener’a, o nazwie MyCustomListener, który będzie wypisywał informacje do okienka konsoli (wiem, że taki listener jest w .NET, ale na potrzeby przykładu takie założenie będzie w sam raz). Postaram się, by wszystkie elementy były jak najprostsze, aby łatwo można było zrozumieć przykład.

Jak naproście zaimplementować naszego listener’a? Trzeba odziedziczyć po klasie TraceListener i zaimplementować dwie metody: Write i WriteLine, np. tak:

namespace MyApplicationNamespace
{
  class MyCustomListener : TraceListener
  {
    public override void Write(string message)
    {
      Console.Write(" Write: " + message);
    }
    public override void WriteLine(string message)
    {
      Console.WriteLine(" WriteLine: " + message);
    }
  }
}

Zauważmy, że oprócz samej wiadomości dodaję jeszcze na początku "Write:" lub "WriteLine:", czemu? Zobaczymy w końcowej aplikacji. Przejdźmy teraz do głównego programu, oto kod:

namespace MyApplicationNamespace
{
  class Program
  {
    static void Main(string[] args)
    {
      TraceSource mySource = new TraceSource("MySourceName");
      mySource.TraceEvent(TraceEventType.Information, 777, "My Information Message");
      Console.ReadLine(); //waiting for enter
    }
  }
}

Co się tu dzieje? Tworzone jest źródło: "MySourceName" (zapamiętajmy nazwę - będzie użyta w konfiguracji), następnie wrzucamy do logu informację o numerze 777 i treści My Information Message". Teraz konfiguracja:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.diagnostics>
    <sources>
      <source name="MySourceName" switchName="MySwitch" switchType="System.Diagnostics.SourceSwitch"  >
        <listeners>
          <add name="customListener"/>
          <remove name="Default"/>
        </listeners>
      </source>
    </sources>
    <switches>
      <add name="MySwitch" value="All" />
    </switches>
    <sharedListeners>
      <add name="customListener" type="MyApplicationNamespace.MyCustomListener,MyApplication">
        <filter type="System.Diagnostics.EventTypeFilter" initializeData="All" />
      </add>
    </sharedListeners>
  </system.diagnostics>
</configuration>

Na co trzeba zwrócić uwagę? Przede wszystkim ważna jest nazwa źródła: "MySourceName", musi ona być zgodna z tą w programie. Po drugie ważne jest w jaki sposób dodajemy listener’a, musimy tutaj użyć odpowiedniej konstrukcji (z nazwą assembly): <add name="nazwa_listenera" type="namespace_w_ktorym_jest_listener.nazwa_klasy_listenera,nazwa_naszego_assembly">.

Co się stanie po uruchomieniu? Powinniśmy otrzymać efekt:

Write: MySourceName Information: 777 :  WriteLine: My Information Message

Jak widać zostały wywołane obydwie metody naszego MyCustomListener’a, najpierw pojawiła się nazwa źródła i identyfikator (wypisana poprzez Write), a później (przy pomocy WriteLine) wypisana została właściwa wiadomość.

Proste prawda? ;)

2 komentarze:

Posty powiązane / Related posts