Programmering

Slik implementerer du en enkel logger i C #

Du vil ofte logge på hendelser eller feil slik de oppstår i .Net-applikasjonen. For å gjøre dette kan du dra nytte av en av de mange populære loggerammene som er tilgjengelige, eller du kan designe og utvikle ditt eget loggerammverk. I denne artikkelen ser vi hvordan vi enkelt kan designe og utvikle vårt eget loggingsrammeverk, og gå gjennom trinnene for å bygge en enkel logger i C #.

For det første må du forstå loggmålene - de forskjellige stedene hvor dataene kan logges. La oss anta at vi vil logge dataene til flate filer, en database og hendelsesloggen. Følgende oppregning definerer loggmålene vi vil bruke i dette enkle rammeverket.

offentlig enum LogTarget

    {

Fil, database, EventLog

    }

C # logger klasser

Neste trinn er å designe og implementere klassene. Vi vil bruke tre forskjellige klasser - nemlig FileLogger, DBLogger, og EventLogger—Til å logge data til henholdsvis en fil, en database og hendelsesloggen. Alle disse klassene bør arve den navngitte abstrakte basisklassen LogBase. Slik er disse klassene organisert.

  offentlig abstrakt klasse LogBase

    {

offentlig abstrakt ugyldig Logg (strengmelding);

    }

offentlig klasse FileLogger: LogBase

     {

offentlig streng filePath = @ ”D: \ Log.txt”;

offentlig overstyring ugyldig logg (strengmelding)

        {

bruker (StreamWriter streamWriter = ny StreamWriter (filePath))

            {

streamWriter.WriteLine (melding);

streamWriter.Close ();

            }           

        }

    }

offentlig klasse DBLogger: LogBase

    {

streng connectionString = string.Empty;

offentlig overstyring ugyldig logg (strengmelding)

        {

// Kode for å logge data til databasen

        }

    }

offentlig klasse EventLogger: LogBase

    {

offentlig overstyring ugyldig logg (strengmelding)

        {

EventLog eventLog = new EventLog (“”);

eventLog.Source;

eventLog.WriteEntry (melding);

        }

    }                                

Jeg har forlatt DBLogger klasse ufullstendig. Jeg overlater til deg å fylle ut riktig kode for å logge meldingene dine til databasen.

Som du kan se, har alle tre klassene - FileLogger, EventLogger, og DBLogger - utvide den abstrakte basisklassen LogBase. Den abstrakte basisklassen LogBase erklærer den abstrakte metoden kalt Logg(). De Logg() metoden godtar en streng som parameter; denne strengen er det som skal logges til en fil eller en database eller hendelsesloggen.

C # LogHelper-klassen

La oss nå lage en hjelperklasse som kan brukes til å påkalle den respektive loggeren basert på parameteren som er sendt. Denne hjelperklassen vil bli brukt til å forenkle samtalene til Logg() metode i hver av loggerklassene. Følgende kodebit illustrerer denne hjelperklassen.

offentlig statisk klasse LogHelper

    {

privat statisk LogBase logger = null;

offentlig statisk ugyldig logg (LogTarget-mål, strengmelding)

        {

bryter (mål)

            {

sak LogTarget.File:

logger = ny FileLogger ();

logger.Log (melding);

gå i stykker;

sak LogTarget.Database:

logger = ny DBLogger ();

logger.Log (melding);

gå i stykker;

sak LogTarget.EventLog:

logger = ny EventLogger ();

logger.Log (melding);

gå i stykker;

misligholde:

komme tilbake;

            }

        }

    }

De Logg() metoden for LogHelper klasse godtar en streng og en forekomst av LogTarget oppregning som parametere. Den bruker deretter en bryter: sak konstruere for å bestemme målet der tekstmeldingen skal logges.

Synkronisering av anrop til C # Log-metoden

Beklager! Vi glemte å synkronisere samtalene til de respektive Logg() metoder. For å gjøre dette må vi bruke nøkkelordet i Logg() metode for hver av loggerklassene og innlemme riktig kode for å synkronisere demLogg() metoder. Referere til LogBase klasse gitt nedenfor. Vi har innlemmet et beskyttet medlem som skal brukes til å bruke låsen i Logg() metode for hver av de avledede klassene. Her er de modifiserte versjonene av disse klassene.

offentlig abstrakt klasse LogBase

    {

beskyttet skrivebeskyttet objektlåsObj = nytt objekt ();

offentlig abstrakt ugyldig Logg (strengmelding);

    }

offentlig klasse FileLogger: LogBase

    {

offentlig streng filePath = @ ”D: \ Log.txt”;

offentlig overstyring ugyldig logg (strengmelding)

        {

lås (lockObj)

            {

bruker (StreamWriter streamWriter = ny StreamWriter (filePath))

                {

streamWriter.WriteLine (melding);

streamWriter.Close ();

                }

            }

        }

    }

offentlig klasse EventLogger: LogBase

    {

offentlig overstyring ugyldig logg (strengmelding)

        {

lås (lockObj)

            {

EventLog m_EventLog = ny EventLog (“”);

m_EventLog.Source;

m_EventLog.WriteEntry (melding);

            }

        }

    }

offentlig klasse DBLogger: LogBase

    {

streng connectionString = string.Empty;

offentlig overstyring ugyldig logg (strengmelding)

        {

lås (lockObj)

            {

// Kode for å logge data til databasen

            }

        }

    }

Du kan nå ringe Logg() metoden for LogHelper klasse og passere loggmålet og tekstmeldingen for å logge som parametere.

klasse Program

    {

statisk tomrom Main (streng [] args)

        {

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

        }

    }

Hvis du noen gang trenger å logge tekstmeldingen til et annet loggmål, vil du ganske enkelt sende riktig loggmål som parameter til Logg() metoden for LogHelper klasse.

Det er mange måter du kan forbedre dette loggingsrammeverket. Du kan implementere asynkroni og en kø slik at når et stort antall meldinger kommer, kan loggeren behandle disse meldingene asynkront uten å måtte blokkere den gjeldende tråden. Det kan også være lurt å implementere kritikknivåer for meldinger, for eksempel informasjonsmeldinger, advarsler, feilmeldinger og så videre.

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