implement-diagnostics-in-an-application---tracing---1-ci-hisse

Implement diagnostics in an application : Tracing - 1-ci hissə

Tracing imkan verir ki, işləyən proqram haqqında müxtəlif informasiya xarakterli məlumatları görə bilək.

               Biz adəti üzrə application-ları Debug rejimində işə salır, lazımi yerlərə breakpoint qoyuruq. Lakin bu case heç də Release rejimi üçün keçərli deyil. Çünki release rejimində proqramın behaviour-u nisbətən fərqlənir. Yaddaş optimizasiyası baxımından Garbage collector daha intensiv işləyir, kod optimizasiya üçün kompilyator optimal kod generasiya edir, həmçinin kod bloklarının yeri dəyişə bilir. Yəni nəticə olaraq Debug rejimindəki birəbir rəftar qaydasını Release rejimində görə bilmirik. Həmçinin proqram deploy olunduqdan sonra proqram axınını izləmək üçün built-in quraşdırılmış mexanızm yoxdur.

               Trace - proqramın axınına nəzarət etmək, proqramda baş verə biləcək hər hansı problemləri və ya sadəcə flow gedişatını izləmək üçündür.

.NET-də Trace arxitekturası:

               Tracing-ə ümumiyyətlə 4 blokun kombinasiyası şəklində baxmaq olar:

Source- trace mesajlarini hazırlayan mənbə

 Listeners- trace məlumatları haraya yazılacaq

Switch – Trace məlumatlarının log levelini təyin etmək

Filters- hansı trace məlumatlarının listener-lar  tərəfindən emal ediləcəyini təyin etmək.

               Tracing prosesini aktiv etmək üçün TraceSource clasının obyekti yaradılır. TraceInformation(), TraceData() və ya TraceEvent() metodlarından birisini istifadə edərək məlumat axınını təmin etmək olur. TraceSource informasiyanı ilkin olaraq Output-Debug pəncərəsinə yazır. Amma aşağidakı kod nümunəsindən aydın olur ki, məlumat göndərilməsi komandası verilsə də Output pəncərəsində heç bir məlumat görünmür. Səbəb isə Trace üçün Switch mexanizminin by default Off rejimində olmasıdır.

Məqalənin davamında Switch aktiv edildikdən sonra artıq mesajları görmək mümkün olacaq. Amma Switch-ə keçmədən əvvəl TraceSource metodları ilə yaxından tanış olaq.

TraceEvent()- TraceSource hansısa bir mesajı yox, müəyyən tipdə olan mesajları listenerlərə göndərir. Yəni mesaj yazarkən həmin mesajın tipini göstərmək lazımdır. Mesajın tipi onun hansı kateqoriyaya(error mesajı, sadəcə informasiya xarakterli mesaj, proqramın istisna halı verdiyini göstərən və ya tamamən sıradan çıxdığını göstərən kateqoriya  və.s) aid olduğunu göstərir. Proqramın rəftar qaydasından asılı olaraq bu mesajları tənzimləmək olar.  Misalçün, əgər TraceEventType.İnformation göstərsəniz bu sadəcə informasiya xarakterli məlumat sayılır, amma TraceEventType.Critical göstərsək bu o deməkdir ki, artıq proqram sıradan çıxır. Id isə sadəcə razılaşma qaydası olaraq mesaj addımlarına verilən identifikatordur. Bunu komanda halında təyin etmək və ya hansısa bir  razılaşma əsasında istifadə etmək olar.

Aşagıdakı nümunədə id=1 metoda giriş, id=2 isə metoddan çıxışı göstərir.

Traceİnformation()- TraceSource vasitəsilə yalnız informasiya xarakterli mesajları listenerlara göndərmək üçündur. Əslində bu metod TraceEvent() metodu üçün bir örtükdür və arxa planda TraceEvent(TraceEventType.İnformation, 0, message) şablonunu əvəz edir. Bunun kimi bənzəri metodları extension olaraq özümün də yaza bilərik.

TraceData()- bu metod vasitəsilə birbaşa hansısa obyekti götürüb listenerlərə vermək olar. Adəti üzrə istisna hallarında Exception instance-ı bu metod vasitəsilə göndərilir.

               Yazdığınız kod nümunəsində TraceSource metodlarının minimal şəkildə Output-a mesaj yazmasını istəyiriksə ozaman TraceSource üçün Switch aktiv edilməlidir. Switch imkan verirki məlumatları tipinə görə filter edək . Switch klasının törəməsi olan SourceSwitch adından məlum olduğu kimi, mənbə(source) tərəfdə yən TraceSource-da filter üçün istifadə olunur. Onun enum parametrləri hansı qrup mesajların listenerlərə göndərilə biləcəyini tənzimləyir.

 public class HomeController : Controller
    {
        private readonly TraceSource _tracing;
        public HomeController()
        {

            _tracing = new TraceSource("ClassicMVCApp.HomeController");
            //Critical , Error və warning məlumatlarının listener-lara göndərilməsinə icazə ver.
            _tracing.Switch = new SourceSwitch("ClassicMVCApp.AllSwitching") { Level = SourceLevels.Warning };
        }
        public ActionResult All()
        {
           var students = StudentDb.Students;

            return View(students);
        }

        public string GetNames()
        {
            _tracing.TraceEvent(TraceEventType.Information, 1, "GetNames action started");
            _tracing.TraceError("Some error message for testing purpose");

            List<string> names = new List<string>() { "Shoto Todoroki", "Midoriya", "Endeavor", "Katsuki" };

            string ns = String.Join(",", names);
            _tracing.TraceEvent(TraceEventType.Warning, 4, "Some warning message");
            _tracing.TraceEvent(TraceEventType.Information, 2, "GetNames action ended");
            return ns;
        }
    }

Şəkildən göründüyü kimi, İnformation xarakterli mesajlar görünmür. Çünki  Switch tərəfindən filter edilmir.

SourceSwitch məlumatlarını proqramdan kənar konfiq edə bilmək üçün onu tamamilə koddan çıxardıb konfiq üzərindən proqrama əlavə edə bilərik. Bunun üçün App.config və ya Web.config faylında configuration teqi altında belə yazmaq lazımdır.

Artıq kodda sadəcə TraceSource-un obyektini yaradıb, ona configdə verilən adı verməklə (heç bir SourceSwitch məlumatını kodda göstərmədən) listenerlara məlumat göndərmək olar.

               TraceSource müxtəlif listener-lara məlumat yaza bilər. Gələn məqalədə mövzumuz həmin listener-lar və onlara filterlərin verilməsi olacaq.

PS: Məqalələrimizi bəyənirsinizsə yuxarıdakı paylaşım düymələri vasitəsilə müxtəlif sosial şəbəkələrdə paylaşıb başqalarının da faydalanmasına kömək edə bilərsiniz.

 

Tural

Tural Süleymani

Süleymani Tural Microsoft-un MCSD statuslu mütəxəssisidir, 2008-ci ildən bu yana proqramlaşdırma üzrə tədris aparır

Müəllifin bu dildə ən son postları

Bu yazıları da bəyənə bilərsiniz