Programovanie

Ako implementovať jednoduchý záznamník v C #

Často budete chcieť zaznamenávať udalosti alebo chyby, ktoré sa vyskytujú vo vašej aplikácii .Net. Ak to chcete urobiť, môžete využiť jeden z mnohých populárnych dostupných protokolových rámcov alebo môžete navrhnúť a vyvinúť svoj vlastný protokolovací rámec. V tomto článku si ukážeme, ako môžeme ľahko navrhnúť a vyvinúť náš vlastný rámec protokolovania, a prejdeme krokmi po zostavení jednoduchého protokolovacieho nástroja v jazyku C #.

Najskôr budete musieť pochopiť ciele protokolu - rôzne miesta, kde sa dajú údaje zaznamenať. Predpokladajme, že údaje zapíšeme do plochých súborov, databázy a protokolu udalostí. Nasledujúci výčet definuje ciele protokolu, ktoré by sme použili v tomto jednoduchom rámci.

verejný výčet LogTarget

    {

Súbor, databáza, EventLog

    }

C # triedy záznamníka

Ďalším krokom je návrh a implementácia tried. Budeme používať tri odlišné triedy - a to FileLogger, DBLoggera EventLogger—Zapisovať údaje do súboru, databázy a denníka udalostí. Všetky tieto triedy by mali dediť pomenovanú abstraktnú základnú triedu LogBase. Takto sú organizované tieto triedy.

  verejná abstraktná trieda LogBase

    {

public abstract void Log (reťazcová správa);

    }

verejná trieda FileLogger: LogBase

     {

verejný reťazec filePath = @ ”D: \ Log.txt”;

public override void Log (reťazcová správa)

        {

pomocou (StreamWriter streamWriter = nový StreamWriter (filePath))

            {

streamWriter.WriteLine (správa);

streamWriter.Close ();

            }           

        }

    }

verejná trieda DBLogger: LogBase

    {

string connectionString = string.Empty;

public override void Log (reťazcová správa)

        {

// Kód na prihlásenie údajov do databázy

        }

    }

verejná trieda EventLogger: LogBase

    {

public override void Log (reťazcová správa)

        {

EventLog eventLog = nový EventLog („“);

eventLog.Source;

eventLog.WriteEntry (správa);

        }

    }                                

Opustil som DBLogger trieda neúplná. Nechám na vás vyplnenie príslušného kódu na prihlásenie vašich správ do databázy.

Ako vidíte, všetky tri triedy - FileLogger, EventLoggera DBLogger - rozšíriť abstraktnú základnú triedu LogBase. Abstraktná základná trieda LogBase deklaruje abstraktnú metódu nazvanú Denník (). The Denník () metóda prijíma reťazec ako parameter; tento reťazec predstavuje to, čo sa zaznamená do súboru alebo databázy alebo do denníka udalostí.

Trieda C # LogHelper

Teraz vytvorme triedu pomocníka, ktorú je možné použiť na vyvolanie príslušného záznamníka na základe zadaného parametra. Táto pomocná trieda sa použije na zjednodušenie hovorov do súboru Denník () v každej z tried protokolovacích nástrojov. Nasledujúci úryvok kódu ilustruje túto triedu pomocníka.

verejná statická trieda LogHelper

    {

súkromný statický záznamník LogBase = null;

verejný statický neplatný protokol (cieľ LogTarget, reťazcová správa)

        {

prepínač (cieľ)

            {

prípad LogTarget.File:

logger = nový FileLogger ();

logger.Log (správa);

prestávka;

prípad LogTarget.Database:

logger = nový DBLogger ();

logger.Log (správa);

prestávka;

prípad LogTarget.EventLog:

logger = nový EventLogger ();

logger.Log (správa);

prestávka;

predvolené:

návrat;

            }

        }

    }

The Denník () metóda LogHelper trieda prijíma reťazec a inštanciu súboru LogTarget enumerácia ako parametre. Potom použije a prepínač: puzdro konštruovať na určenie cieľa, kam sa textová správa zaznamená.

Synchronizácia hovorov s metódou C # Log

Ojoj! Zabudli sme synchronizovať hovory s príslušnými Denník () metódy. Aby sme to dosiahli, musíme použiť kľúčové slovo lock v Denník () metódy každej z tried protokolovacích nástrojov a začleniť príslušný kód na ich synchronizáciuDenník () metódy. Pozrite si LogBase trieda uvedená nižšie. Začlenili sme chránený člen, ktorý sa použije na použitie zámku v Denník () metódy každej z odvodených tried. Tu sú upravené verzie týchto tried.

verejná abstraktná trieda LogBase

    {

chránený objekt iba na čítanie lockObj = nový objekt ();

public abstract void Log (reťazcová správa);

    }

verejná trieda FileLogger: LogBase

    {

verejný reťazec filePath = @ ”D: \ Log.txt”;

public override void Log (reťazcová správa)

        {

zámok (lockObj)

            {

pomocou (StreamWriter streamWriter = nový StreamWriter (filePath))

                {

streamWriter.WriteLine (správa);

streamWriter.Close ();

                }

            }

        }

    }

verejná trieda EventLogger: LogBase

    {

public override void Log (reťazcová správa)

        {

zámok (lockObj)

            {

EventLog m_EventLog = nový EventLog („“);

m_EventLog.Source;

m_EventLog.WriteEntry (správa);

            }

        }

    }

verejná trieda DBLogger: LogBase

    {

string connectionString = string.Empty;

public override void Log (reťazcová správa)

        {

zámok (lockObj)

            {

// Kód na prihlásenie údajov do databázy

            }

        }

    }

Teraz môžete zavolať na Denník () metóda LogHelper triedy a odovzdať cieľ protokolu a textovú správu do protokolu ako parametre.

triedny program

    {

static void Main (reťazec [] args)

        {

LogHelper.Log (LogTarget.File, „Hello“);

        }

    }

Ak budete niekedy potrebovať prihlásiť textovú správu na iný cieľ protokolu, jednoducho by ste príslušnému cieľu protokolu odovzdali ako parameter protokolu Denník () metóda LogHelper trieda.

Existuje mnoho spôsobov, ako môžete tento rámec protokolovania vylepšiť. Môžete implementovať asynchrónnosť a front, aby pri príchode veľkého počtu správ mohol záznamník tieto správy spracovať asynchrónne bez toho, aby bolo potrebné blokovať aktuálne vlákno. Možno budete tiež chcieť implementovať úrovne kritickosti správ, napríklad informačné správy, varovné správy, chybové správy atď.

$config[zx-auto] not found$config[zx-overlay] not found