Makale Özeti

Dağınık yapıda bir uygulamanız var . yada firma içerisinde birden fazla client da kullanılan program da merkezi trace takibi nası yapılır sorusuna basit bir çözüm

Makale

Her yerde Trace ettim kendim nasıl Kontrol Ettim

Bugün Trace nesnesi ve Windows Messaging karışımı bir Uygulama Trace Konsülü yapacağız.

Aklınıza gelebilir bu ne işime yarıcak benim diye. Hemen izah edeyim.

Distributed bir application yaptınız.Birden fazla arayüz,birden fazla Class, birden fazla Platform var. WEB Application, Web Service, Console Application, Windows Forms Application ve Bunlarada ortak olan Bussiness Logic tier(katman) ve Data tier var. Eeee.. İşte bu noktada bunların tamamını tek bir yerde nası trace edeceğim. Sorusunun cevabı nı vermeye çalışacağım.

Her şeyden önce trace nedir sorusuna bir cevap verelim .. Trace her türlü .Net yazılımınızda program akışınızın gidişatını kontrol edebileceğiniz, yada her türlü try..catch bloğunuzda yakaladığınız exceptionları gösterebileceğiniz yani program içinde istediğinizi size not olarak sunacak bir nesnedir. System.diagnostics namespace altında bulunur.

Neyse biz bu trace mesajlarının tamamını hemde aynı yada farklı solutionlar içindekileri bile tek bir merkezde toplayarak merkezi bir haber alma ağı kuracağız.

İlk olarak haber alma ağımız için bir ajan oluşturmalıyız ki tüm bu trace mesajlarını toplayarak bize teker teker sunsun.

Sonra ajanımızın sunduğu bilgileri bir yerde toplamalıyız Sonrada bu toplanma bölgesinden onları alıp işleyerek istediğimizi görmeliyiz.

Ajan oluşturmak nedir şimdi ona bakalım..

Tüm Trace ve Debug mesajları listener denen nesnelerce dinlenir ve işlem yapılır. İşte biz ajanımızı bu dinleyiciler arasına yerleştirceğiz. Ve doğal olarak o zaman gönderilen tüm trace mesajlarını artık bizde duyacak ve istediğimiz işlemi yapacağız

Bunun için bir Trace2Message Class oluşturacağız ve system.diagnostics.tracelistener classından inherit edeceğiz. Bu class da must override olan write ve writeln metodları var onları override edeceğiz ve bu metodlara gelen mesajları mesaj toplama merkezimiz olan messageQueue ye göndereceğiz.

Daha sonrada bu toplama merkezinden mesajları alacak console uygulamamızı yapacağız. Bu uygulamayı ben shell tarzı yaptım içimden öle geldi. Siz istediğiniz gibi yapın tabiî ki..

 

Bu Trace2Message classı ajanımız.

İçinde must override Writeln ve Write metodları var. bide Mesaj toplama merkezine mesaj gönderen SendMessage Private metodumuz.

Şimdi Sıra mesaj toplama merkezi olarak nitelendirdiğim yer nedir? Nası bişeydir sorusunun cevabına:

Windows Message Queuing evet evet Message Queuing. Çok basit dimi.. Windowsun kullanıma sunduğu çok güzel bir özellik bu.. Domain varsa bilgisayarlar arası çok rahat şekilde bırakın metinleri Objeleri bile gönderip alabileceğiniz bir yapı. Sen Queue ye ekle.. gideceği yeri söle Windows senin için alsın versin sen keyfine bak. Şu anda domain kullanmadan tek bir bilgisayar üstünde ki traceleri toplucaz ama eğer windows domain var ise domain içindeki tüm traceleri toplayabileceğiniz bir mesaj toplama merkezi olur. Bundan sonra yapacaklarınız sizin hayal gücünüze bağlı ben sadece bir örnek vereceğim..

Sırası ile Metodlarımızı inceleyelim

Burda ne yapıyoruz localhost da yani ".\" , belirttiğimiz isimde bir toplama merkezi var mı ? diye kontrol ediyoruz. Eğer varsa işlemlere devam ediyoruz. Eğer yoksa yenisini yaratıyoruz. Burda dikkat etmemiz gereken bir nokta var . Oda merkezin tipi, Transactional mı yoksa düz mü olacağı. Nası yani dediğinizi duyuyor gibiyim.. Evet Transactional yani yarım kalma, hatalı gitme sorunlarını ortadan kaldıracak bir düzenek Data namespacindeki transaction gibi.. hata mı oluştu .. gidenleri geri al.. daha sonra tekrar dene..

Transactional olması benim açımdan önemli çünki ben veri kaybı olmasını istemiyorum bu nedenle transactional bir queue tanımlıyorum.

Must Overridelarımız write ve Writeln.

 İkisininde içi aynı. Gelen mesajı Queue mize ekleyen Functionu çağırır.

Ama dikkat ettiyseniz her şey thread ler ile çalışmakta. Neden? Çünki traceler yazılırken ana işlemlerimizi yavaşlatmamalı, tek bir application için belki önemli değil thread olması ama, Distributed bir application var ise ve saniyede 5-10-100 bussiness proses çalışma ihtimali var ise o zaman bu traceler beni yer ,sizi yer, kaynakları yer hepimizi yer.

Kaynak planlamasıymış vs uğraşmadan at sıraya framework ilgilensin senin için, koy mesaj sırasına Windows ilgilensin senin için teslimine neyse…

Son olarakda SendMessage metodu

  1. Transaction yarat.
  2. Transaction aç.
  3. Mesaj gönder
  4. Transaction kapat.

Local üzerinde çalışırken aslında böyle bir transaction kullanmak mantıklımı diye sorabiliriz .. aslında bu haklısınız pek mantıklı değil. Erişim problemimiz olmuyacağı için transactional bir gönderime gerek yok Ama domain de olacaksa mesaj toplama merkezi ne olacak?.

Transaction ile gitmeyenleri locale taşıyıp bir message trigger ile tekrar göndermeye çalışabiliriz. Bu işlemi kolaylaştırır bize.

 

Tracelerimizi Mesaja Çeviren Kısım Bu kadar. Şimdi bunu nasıl Kullanacağımızı görelim

 

system.diagnostics.trace.listeners.add(new mel.trace2Message("MesajToplamaMerkezi"))

bu kadar...

daha sonra yazdığınız tüm trace.write veya trace.writeln komutları artık bir yerde toplanacak ve Ordan siz görebileceksiniz

 

Bu mesajları görmek için ne yapmak gerekli

Ben bir Console Örneğinin kodunu ekte verdim.. Hayal gücü ile neler çıkar daha içinden ..

 

İyi Çalışmalar

 

 

 

 

 

Trace2Message Klassı Kaynak Kodu

Message Console Uygulaması Kaynak Kodu