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? ;)
Warto przeczytać również: SpecialFolders i zmienne systemowe w definicji TraceListener'a
OdpowiedzUsuńCała procedura nie wydaje się zbyt skomplikowana
OdpowiedzUsuń