Programování

Jak implementovat jednoduchý záznamník v C #

Často budete chtít protokolovat události nebo chyby, které se vyskytnou ve vaší aplikaci .Net. Chcete-li to provést, můžete využít jednu z mnoha dostupných populárních rámců protokolování nebo můžete navrhnout a vyvinout vlastní rámec protokolování. V tomto článku uvidíme, jak můžeme snadno navrhnout a vyvinout vlastní rámec protokolování, a projít kroky k vytvoření jednoduchého protokolovacího nástroje v C #.

Nejprve budete muset porozumět cílům protokolu - různým místům, kde lze data zaznamenávat. Předpokládejme, že data zaznamenáme do plochých souborů, databáze a protokolu událostí. Následující výčet definuje cíle protokolu, které bychom použili v tomto jednoduchém rámci.

veřejné výčet LogTarget

    {

Soubor, databáze, EventLog

    }

C # třídy záznamníku

Dalším krokem je návrh a implementace tříd. Budeme používat tři odlišné třídy - jmenovitě FileLogger, DBLogger, a EventLogger—Protokolovat data do souboru, databáze a protokolu událostí. Všechny tyto třídy by měly dědit abstraktní základní třídu s názvem LogBase. Takto jsou tyto třídy organizovány.

  veřejná abstraktní třída LogBase

    {

public abstract void Log (řetězcová zpráva);

    }

veřejná třída FileLogger: LogBase

     {

veřejný řetězec filePath = @ ”D: \ Log.txt”;

public override void Log (zpráva řetězce)

        {

pomocí (StreamWriter streamWriter = nový StreamWriter (filePath))

            {

streamWriter.WriteLine (zpráva);

streamWriter.Close ();

            }           

        }

    }

veřejná třída DBLogger: LogBase

    {

string connectionString = string.Empty;

public override void Log (zpráva řetězce)

        {

// Kód pro přihlášení dat do databáze

        }

    }

veřejná třída EventLogger: LogBase

    {

public override void Log (zpráva řetězce)

        {

EventLog eventLog = nový EventLog („“);

eventLog.Source;

eventLog.WriteEntry (zpráva);

        }

    }                                

Opustil jsem DBLogger třída neúplná. Nechám na vás, abyste vyplnili příslušný kód pro přihlášení vašich zpráv do databáze.

Jak vidíte, všechny tři třídy - FileLogger, EventLogger, a DBLogger - rozšířit abstraktní základní třídu LogBase. Abstraktní základní třída LogBase deklaruje volanou abstraktní metodu Protokol (). The Protokol () metoda přijímá řetězec jako parametr; tento řetězec je to, co bude zaznamenáno do souboru nebo databáze nebo do protokolu událostí.

Třída C # LogHelper

Nyní vytvořme pomocnou třídu, kterou lze použít k vyvolání příslušného záznamníku na základě předaného parametru. Tato pomocná třída se použije ke zjednodušení volání do Protokol () metoda v každé z tříd protokolovacích zařízení. Následující fragment kódu ilustruje tuto pomocnou třídu.

veřejná statická třída LogHelper

    {

soukromý statický LogBase logger = null;

public static void Log (LogTarget target, string message)

        {

přepínač (cíl)

            {

případ LogTarget.File:

logger = nový FileLogger ();

logger.Log (zpráva);

přestávka;

případ LogTarget.Database:

logger = nový DBLogger ();

logger.Log (zpráva);

přestávka;

případ LogTarget.EventLog:

logger = nový EventLogger ();

logger.Log (zpráva);

přestávka;

výchozí:

vrátit se;

            }

        }

    }

The Protokol () metoda LogHelper třída přijímá řetězec a instanci LogTarget výčet jako parametry. Poté použije a přepínač: pouzdro konstrukt k určení cíle, kam bude textová zpráva zaznamenána.

Synchronizace hovorů s metodou C # Log

Jejda! Zapomněli jsme synchronizovat hovory s příslušnými Protokol () metody. K tomu musíme použít klíčové slovo lock v Protokol () metody každé z tříd protokolovacích strojů a začlenit příslušný kód pro jejich synchronizaciProtokol () metody. Odkazovat na LogBase třída uvedená níže. Začlenili jsme chráněný člen, který bude použit k použití zámku v Protokol () metoda každé z odvozených tříd. Zde jsou upravené verze těchto tříd.

veřejná abstraktní třída LogBase

    {

chráněný objekt jen pro čtení lockObj = nový objekt ();

public abstract void Log (řetězcová zpráva);

    }

veřejná třída FileLogger: LogBase

    {

veřejný řetězec filePath = @ ”D: \ Log.txt”;

public override void Log (zpráva řetězce)

        {

zámek (lockObj)

            {

pomocí (StreamWriter streamWriter = nový StreamWriter (filePath))

                {

streamWriter.WriteLine (zpráva);

streamWriter.Close ();

                }

            }

        }

    }

veřejná třída EventLogger: LogBase

    {

public override void Log (zpráva řetězce)

        {

zámek (lockObj)

            {

EventLog m_EventLog = nový EventLog („“);

m_EventLog.Source;

m_EventLog.WriteEntry (zpráva);

            }

        }

    }

veřejná třída DBLogger: LogBase

    {

string connectionString = string.Empty;

public override void Log (zpráva řetězce)

        {

zámek (lockObj)

            {

// Kód pro přihlášení dat do databáze

            }

        }

    }

Nyní můžete zavolat na Protokol () metoda LogHelper třídy a předejte cíl protokolu a textovou zprávu do protokolu jako parametry.

třídní program

    {

static void Main (řetězec [] args)

        {

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

        }

    }

Pokud budete někdy potřebovat přihlásit textovou zprávu k jinému cíli protokolu, jednoduše předáte příslušný cíl protokolu jako parametr do Protokol () metoda LogHelper třída.

Existuje mnoho způsobů, jak můžete tento rámec protokolování vylepšit. Mohli byste implementovat asynchronii a frontu, aby při příchodu velkého počtu zpráv mohl záznamník tyto zprávy zpracovat asynchronně, aniž by bylo nutné blokovat aktuální vlákno. Můžete také chtít implementovat úrovně kritičnosti zpráv, jako jsou informační zprávy, varovné zprávy, chybové zprávy atd.

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