Avatar billede wmann Nybegynder
09. juli 2008 - 10:44 Der er 4 kommentarer

SmartLogger og static

Jeg ved at lave min egen lille logger.
Det er overordnet en klasse der hedder SmartLogger der skal skrive til en generel log (en log der viser alle andres log beskeder - for at skabe overblik).
Derunder er der en DEBUG, INFO, WARNING, EXCEPTION, ERROR som er loggere med forskellige metoder og attributter.

DEBUG - skriver debug-info til mig selv som skal bruges til fejlfinding i programmer jeg afleverer til kunder.

INFO - skriver generel info til brugeren.

WARNING - skriver warnings for noget fx. ikke er sat/loadet men som ikke er så kritisk så programmet vil lukke ned, medmindre den kommer i specielle særtilfælde.

ERROR - sigende fejlmeddelelser til brugeren som han forstår.

EXCEPTION - Detaljeret beskrivelse af exceptionen så jeg kan se hvad der egentligt er sket og måske løse hvorfor.

Hver af disse har så mulighed for at have hver deres log-fil med seperat destination at skrive til - så du kan skjule de detaljerede jeg skal bruge for brugeren så det ikke forvirrer ham.
--------------------------------------------

Jeg har så lavet SmartLogger som static variabel på sig selv, men som sættes med det samme i variablen.
--> private static SmartLogger smartlogger = new SmartLogger();
så den forbliver i memory så stien der er sat til generel-log ikke bliver nulstillet.
1. Men vil den blive instancieret når jeg fx. bruger smartloggers, static metoder?
Fx. hvis jeg siger "SmartLogger.DEBUG.WriteLine("Text")" vil SmartLogger så blive instancieret pga. ovenstående variabel eller vil den kun blive det når jeg arbejder på SELVE smartloggers metoder?


Smartlogger holder så ligeledes hver underlogger som static objekter for også at holde alle disse i memory så deres path og filename forbliver det brugeren sætter dem til når han bruger min dll.

Jeg har så lavet et interface for hvad alle mine loggere skal have af metoder og en implementering af denne som bliver abstract således jeg kan nedarve denne klasse og dermed få attributter og metoder der er instancierede uden at skulle sætte der på HVER logger. MEN..
Nu er disse jo ikke abstract variabler..

2. Vil almindelige private variabler forblive i memory så længe selve klassen der holder dem er static?
For så beholdes klassen/objektet i memory men vil dens attributter så også forblive i memory og forblive samme værdier hvis de ændres til andet end standart?
Avatar billede kodehoved Nybegynder
09. juli 2008 - 12:09 #1
Først og fremmest vil jeg sige, at jeg har svært ved at se, hvorfor du ikke blot bruger System.Diagnostics direkte (eller Enterprise Library hvis du har større behov). Så vidt jeg kan bedømme ud fra din beskrivelse, tilføjer du ikke rigtig noget.

Men for at svare på dit spørgsmål: Statiske variable bliver initialiseret før den statiske constructor for typen. Den statiske constructor bliver kaldt 1) inden en instans af typen bliver lavet eller 2) før et statisk felt tilgås (hvad der så end kommer først).

Ergo, kan du regne med at du får sat din værdi inden den skal bruges.

mvh
Brian
Avatar billede wmann Nybegynder
09. juli 2008 - 13:06 #2
Jo for i hver logger-type vil jeg lave specialiseringer som gør noget andet udover det fælles den nedarver..
Og bruger ikke System.Diagnostics fordi jeg kan ikke se den kan lave en log til mig med:
14.50:17:322 [  INFO  ] Applikationen startet.
14.53.43:781 [  DEBUG  ] Indlæs værdier begyndt.
14.53.44:871 [  DEBUG  ] variabel 'app' sat.
14.53.44:873 [ WARNING ] 'compressEvent' blev ikke sat. Hvis addVariable kaldes kan der opstå problemer.
14.53:45:264 [  ERROR  ] En uventet fejl opstod pga. en værdi. Programmet afsluttes.
14.53:45:264 [EXCEPTION] Null-reference exception -Method: addVariable -Line: 5 -Colum: 13 | Fejl under opsætning af config-fil til varKørsel.

Jeg kan samle en masse logik og metoder som jeg tit bruger til logging.
Jeg kan seperere filerne så de skjules for brugerne, og alt opbygget med en logik så jeg bare skal smide den med i mine programmer og så skal jeg ikke kode dele hist og her igen og igen eller stjæle store dele fra gamle projekter. her har jeg samlet det som jeg har behov for.

MEN..
Hvis fx. jeg kalder SmartLogger.DEBUG vil smartlogger så sættes i samme omgang?
For jeg ku godt se at "1) inden en instans af typen bliver lavet", men vil SmartLogger laves som instans være nødvendig at skulle laves når jeg prøver at tilgå en static variabel på en instans.. Fx. hvis du kalder en static metode på et almindeligt objekt så behøver den jo ikke se på om objektet er instancieret eller ikke da den blot bruger static-metoden på objektet.
Så er i tvivl om Smartlogger objektet vil laves denne gang når den ikke gør det ved ikke-static objekttyper, plus når jeg debugger mig igennem processen kommer den ikke op og sætter variablen ligesom det sker ved fx. almindeligt objeker..
Avatar billede kodehoved Nybegynder
09. juli 2008 - 13:27 #3
Lad os fortsætte med spørgsmålet først - jeg ser netop, at jeg har været lidt unøjagtig i min formulering. Punkt 2 gælder ikke blot felter, men "members" (altså både felter og metoder) og det er denne del, der gør at du får sat din variabel, inden du kalder din statiske metode.

Mht Smartlogger eller ej - som jeg læser dit oplæg, vil du lægge selve loggingmekanismen sammen med det System.Diagnostics kalder listener-mekanismen. Det, synes jeg, er en dårlig ide, for du kommer derved til at opgive en masse fleksibilitet, men hvis det er sådan, du foretrækker det, skal du selvfølgelig bare gøre det :)

Brian
Avatar billede wmann Nybegynder
09. juli 2008 - 14:58 #4
Okay tak.

Og nej jeg kalder ikke listener mekanismen. Jeg bruger slet ikke System.Diagnostics (undtagen til meget lidt debug-info).
Jeg laver en logger der kan oprette en fælles log til mig, som jeg ønsker at få for at have overblik.
Den KAN lave seperate logs med udelukkende specifik information (fx. en log med debug-logs i en seperat fil).
Der kan ligeledes sættes om loggeren er enabled eller ej, om der skal medtages debug-info. Hvor meget der skal skrives om exceptions.
Derved kan jeg lave en dll jeg importerer i mine projekter, sætter indstillinger, og så har jeg alt den funktionalitet jeg har behov for og jeg ønsker.

Hvad skal jeg bruge system.Diagnostics til i denne forbindelse? Jeg bruger den til at finde metode, linie, kolonne for mine exceptions og det er det.. Hvad skulle jeg mere ønske mig?

Jeg synes den er perfekt for jeg kan skrive alt min info til forskellige filer hvis det nødvendigt, jeg kan skrive de oplysninger om exceptions jeg har brig for, jeg kan skrive debug-info, warnings laver popup-meddelelser til brugeren hvis det nødvendigt. Jeg kan ændre alle oplysninger for alle logger for en attribut med 2 linier.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester