Avatar billede hlt Juniormester
28. oktober 2010 - 15:25 Der er 30 kommentarer og
2 løsninger

Global.asax

Hej,
Jeg er ved at forsøge mig med et alternativ til at fejlhåndtere via web.config filen, og er i den forbindelse faldet over at man kan gøre det via global.asax.
Men det virker ikke til at være lige til. Ihvertfald kan jeg ikke rigtig få det til at virke.
Det jeg forsøger er at skrive fejlbeskeden til en tekst fil. Jeg har også fejlhåndtering via database, men i det tilfælde at det er databasen der fejler, vil det være rart at man kan se fejlen alligevel.
Men jeg kan ikke få global.asax til at skriv til den fil. det går fint med at oprette, men der kommer intet i filen og desuden låser applikationen. Jeg har forsøgt at lave en redirect når der er skrevet til filen, men den virker heller ikke.
Er der nogen derude der har lavet noget tilsvarende ?
Mvh
Henrik
Avatar billede mcb2001 Nybegynder
28. oktober 2010 - 15:30 #1
jeg vil anbefale dig at kigge på en helt anden teknologi, nemlig NLog, som er et open-source produkt der er utrolig fleksibelt og kan skrive loginformation til et væld af steder, så som databaser, console, eventviewer i windows, tekstfiler og andet.
Det er et rigtig stabilt assemply, og hvis det skal bruges i produktion, vil jeg anbefale at bruge version 1, men hvis det er til udvikling kan version 2 bruges, men den er kun i beta.

http://nlog-project.org/
Avatar billede bkp Nybegynder
28. oktober 2010 - 15:34 #2
nLog er rigtig godt, men til en webside ville jeg nok hellere bruge ELMAH:
http://code.google.com/p/elmah/

Se her hvor nemt det er at implementere:
http://bkristensen.tumblr.com/post/1320290447/jeg-har-et-webprojekt-k-rende-pa-mit-arbejde-hvor
Avatar billede keysersoze Guru
28. oktober 2010 - 16:24 #3
hvilken event og hvilket kode benytter du? Hvis du debugger, hvor "fejler" den så?
Avatar billede hlt Juniormester
28. oktober 2010 - 16:35 #4
Tak for jeres svar
@mcb2001 Er det ikke noget der skal installeres på serveren?

@bkp jeg har haft kigget på elmah, men det ser ud som om det udelukkende bruger databaser. Og jeg ville gerne kunne skrive til en fil såfremt database serveren er nede.

@keysersoze
Jeg bruger
Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
Jeg har ikke prøvet at debugge. Det kører på en live server, men er der ikke noget med at man kan debugge ved at sætte debug = true og så er der en trace fil?
Avatar billede bkp Nybegynder
28. oktober 2010 - 17:30 #5
Ifølge deres side kan du også logge til andre medier som  f.eks. xml, men jeg har dog ikke prøvet, men det er vel bare en parameter der skal sættes
Avatar billede keysersoze Guru
28. oktober 2010 - 18:02 #6
Hvad hvis du kører det lokalt? Sæt et debug-mærke i starten af Application_Error og bevæg dig ned til hvor problemet opstår - et gæt til hvorfor applikationen låser er at der sker en fejl inde i din log-kode og så vil du risikere en uendelig løkke hvilket netop låser applikationen.

Hvis du ikke kan debugge lokalt så må du pakke din kode ind i en try/catch og i catchen logge fejlen til databasen så du kan se hvor i global.asax det går galt - et gæt er at det er noget omkring rettigheder.
Avatar billede arne_v Ekspert
29. oktober 2010 - 03:28 #7
Med et logging framework kan du via konfiguration bestemme hvor meget du logger og hvor det ryger hen.

Jeg foretrækker log4net, men der er andre - nlog er nævnt, men der er også MS EL logging application block.

log4net kan logge til:

console
fil
database
trace log
event log
syslog
messenger
email
rå TCP
rå UDP
Avatar billede mcb2001 Nybegynder
29. oktober 2010 - 10:34 #8
Hej igen

Det er ikke et program der skal installeres på serveren, men en DLL der skal importeres i dit web-site i visual studio solutionen.
Når du så compiler får du både dit eget site + denne DLL og config-fil med ud.

Så skal du bare publishe det hele ud på din webserver.

Så det er altså i Visual Studio du skal lave arbejdet.
Avatar billede bkp Nybegynder
29. oktober 2010 - 11:09 #9
Det nemmeste er nok at benytte nLog som mcb2001 siger, og danner en config fil som beskrevet her:
http://nlog-project.org/wiki/Configuration_file

Jeg bruger selv nedenstående nlog.config til en windows applikation, du skal nok lige gennemse om du vil have andre kolloner: http://nlog-project.org/wiki/Layout_Renderers

<?xml version="1.0" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <targets>
        <target
            name="async"
            xsi:type="AsyncWrapper"
            queueLimit="5000"
            overflowAction="Discard">
            <target
                xsi:type="File"
                fileName="${basedir}/logs/applog.csv"
                lineEnding="CRLF"
                openFileCacheTimeout="15"
                keepFileOpen="true"
                footer="${basedir}">
                <layout xsi:type="CSVLayout">
                    <column name="Nr" layout="${counter}" />
                    <column name="Time" layout="${longdate}" />
                    <column name="Id" layout="${machinename}\${windows-identity}"/>
                    <column name="Level" layout="${level}"/>
                    <column name="Message" layout="${message}" />
                    <column name="Logger" layout="${callsite}"/>
                    <column name="Exception" layout="${exception}"/>
                    <column name="Stacktrace" layout="${stacktrace}"/>
                    <column name="Log4Xml" layout="${log4jxmlevent}"/>
                </layout>
            </target>
        </target>
    </targets>
    <rules>
        <logger name="*" minlevel="Debug" writeTo="async" />
    </rules>
</nlog>
Avatar billede hlt Juniormester
29. oktober 2010 - 11:15 #10
Hej Alle sammen,
Tusind tak for jeres svar. Jeg har siddet og bakset lidt med det her til morgen, og det er kommet til at virke. Det var en af linierne i det der blev skrevet til tekstfilen der fik det hele til at låse.
Så nu virker det. Men jeg må da sige at der findes en del forskellige logging værktøjer. Hvad der er bedst er nok en smagssag. men jeg vil nok kigge nærmere på de forskellige når jeg får en ledig stund. Indtil videre vil jeg nøjes med min egen lille tekstfil.
Men nu har jeg selvfølgelig et problem. Hvem skal have point. I har alle været hjælpsomme.
Er der ikke noget med at man kan dele point? I så fald kan I der vil have point ikke skrive et svar, og så forsøger jeg at dele de point der er mellem jer.
I hvertfald tak for jeres svar.
Avatar billede hlt Juniormester
29. oktober 2010 - 11:20 #11
@bkp
Jeg har kigget på nlog, men jeg kunne ikke rigtig genneskue hvor den nlog.config fil skulle ligge. Det har  jeg så fundet ud af nu. nlog.dll skal være i bin. Er der andet man skal sætte op så?
Avatar billede mcb2001 Nybegynder
29. oktober 2010 - 11:34 #12
Du skal importere den som refrence i Visual Studio. Det er desværre ikke nok "bare" at ligge den i BIN mappen.

Men hvis du læser på nLogs wiki er der masser af guides, også til folk der er helt nybegyndere på dette punkt.
Avatar billede mcb2001 Nybegynder
29. oktober 2010 - 11:35 #13
Og point skal du tildele til dem du mener har været med til at løse din problemstilling, så hvis du selv er kommet frem til en løsning, på baggrund af hjælp fra tre mennesker, så vil jeg dele points i fire, en bunke til hver og resten til dig selv, da vi ikke gav dig den endelige løsning.
Avatar billede bkp Nybegynder
29. oktober 2010 - 11:45 #14
Jeg ved ikke om jeg fortjener point på denne da det egentlig var mcb2001 der startede ud med at nævne nLog :-)

Men der er faktisk ikke andet du skal sætte op andet at lave en reference til nlog og bruge den når du vil logge.

Det smarte er at hvis du på et tidspunkt vil logge på en anden måde, eller lave tilretninger i de data der skal gemmes, så gøres dette bare i config filen.
Avatar billede mcb2001 Nybegynder
29. oktober 2010 - 12:24 #15
jeg er ganske enig. Det er rart det er styret i en config fil, så du ikke skal kode om bare fordi du vil logge andetsteds.
Men jeg synes også du bør overveje at give dig selv nogle af pointene.
Avatar billede hlt Juniormester
29. oktober 2010 - 13:41 #16
Nu har jeg fået det til at virke. men nu har jeg sat customerrors op. Og så bliver der ikke logget noget. Men er det korrekt at hvis jeg gerne vil have logget en fejl, der er pakket ind i en try catch, så skal jeg lægge kaldet til nlog i catch delen og så vil fejlen blive logget?
Avatar billede mcb2001 Nybegynder
29. oktober 2010 - 13:51 #17
ja, du skal bruge noget a'la følgende;

//init - skal foregå ved objekt oprettelse
Logger logger = LogManager.getCurrentClassLogger();

//method - selv metoden der kan fejl
try
{
CODE
}
catch( Exception exc)
{
logger.ErrorException("der skete en fejl", exc);
}

Så bruger du den logger du har oprettet i starten af koden, til at skrive en "Error" log post, som modtager en Exception.

Hvis du kun har behov for at logge Debug, så skal du kalde den som debug, og hvis det er en fatal error, skal du kalde den som fatal.
Avatar billede hlt Juniormester
29. oktober 2010 - 13:58 #18
Det fordi jeg har en database som driller. En til 2 gange om måneden lukker den for brugeren som så bevirker at indholdet ikke bliver vist. Jeg vil gerne have at vide, dels med en email og dels vil jeg gerne have nogen flere informationer om hvorfor. Jeg ved ikke om det er muligt med nlog, men jeg ville også gerne vide klientens IP, informationer omkring browser osv.
men jeg ved ikke helt hvad for en parameter jeg skal sætte ind.

Hvad er forskellen på debug og fatal?
Avatar billede hlt Juniormester
29. oktober 2010 - 14:13 #19
jeg kan ikke få den til at logge de ændringer jeg laver til nlog.config. Hvad skal man gøre for at få den til det? Og så vil jeg gerne have at den bruger datoen som filnavn, men den bliver ved med at skrive minutter altså dagminutterår istedet for dagmånedår(DDMMYY)
Avatar billede mcb2001 Nybegynder
29. oktober 2010 - 14:20 #20
info, debug, error og fatal er forskellige niveauer af logs.

info er informationer. Så som "systemet er startet op".

debug er debugging information. så som "der skete en fejl her, men jeg kørte videre alligevel".

error er error information. så som "der skete en fejl, jeg greb den og slukkede, men der skal kigges på mig".

fatal er fejl information. så som "der skete en uoprettelig fejl, og jeg døde uden at kunne rede noget. Kig på mig med det samme".
Avatar billede hlt Juniormester
29. oktober 2010 - 14:29 #21
he he, ok, så er det vel fint nok at håndtere den med debug. Min side kører jo videre men uden database støtte. Og det er betop det jeg skal bruge det til. At vide hvad der gik galt, hvornår. Og at jeg så, så hurtigt som muligt kan genstarte databasen så den virker igen. Det er så en lidt spøjs fejl med databasen, men den tager jeg i en anden tråd.
Ved du hvorfor mine ændringer ikke bliver vist? Er der noget jeg skal slette for at få den til at æde mine ændringer?
Avatar billede bkp Nybegynder
29. oktober 2010 - 14:47 #22
Din config fil loades når nlog initialiceres, så jeg tror at din IIS webservice skal stoppes og startes før den kender dine nye indstillinger.
Avatar billede hlt Juniormester
29. oktober 2010 - 15:54 #23
Ja det fandt jeg ud af. men jeg tror at der er en parameter til <nlog> som gør at den automatisk genindlæser filen.  autoReload="true". Eller det vil jeg ihvertfald se om det virker.

Jeg kan ikke finde noget dokumentation på når man har flere targets. Nu har jeg både en fil og en mail, men jeg kan ikke få den til at sende nogen mail. Skal man tilføje en rule til mail target?
Avatar billede bkp Nybegynder
29. oktober 2010 - 16:21 #24
Ja, der skal tilføjes en rule mere som henviser til din mail target.
Husk dog at ikke alle mail funktioner virker i version 1, du bør nok bruge version 2 hvis du vil bruge mail funktion.
Avatar billede bkp Nybegynder
29. oktober 2010 - 16:22 #25
Det smarte ved at have flere regler er jo at du f.eks. kan sætte din mail regel til kun at sende fejl, og din fil regel til at logge alt fra debug og opefter.
Avatar billede hlt Juniormester
30. oktober 2010 - 09:58 #26
Det virker fint. Iøvrigt hvis man sætter <nlog autoReload="true"> så bliver ændringer gennemført med det samme.

Er der nogen mulighed for at logge klientens IP og browser indstillinger. Jeg vil meget gerne vide hvilke browser versioner der bruges når databasen går ned. Det skulle være mærkeligt hvis det har noget med klentens browser at gøre, men jeg vil gerne kunne udelukke at det er det.
Men jeg kan ikke lige gennemskue om der er nogen af de muligheder som indeholder de oplysninger.
Avatar billede mcb2001 Nybegynder
30. oktober 2010 - 10:43 #27
hej hlt

Jeg tror du er så langt ude for dit oprindelige spørgsmål, at du måske skal åbne et nyt, hvor du så kan få svar på resten :)
Avatar billede hlt Juniormester
30. oktober 2010 - 11:15 #28
Jeg er temmelig tæt på målet nu:-) Jeg har fået sat nlog op til både at skrive til fil og mail. Og hvis så jeg bare kunne logge de browser informationer som ligger i server variablerne så er jeg en glad mand. Og hvis ikke det kan, er det også fint. Hovedsagen er at jeg bliver informeret om at der er opstået en fejl så hurtigt som muligt. Alternativt, kan man selvfølgelig gemme den tekstfil som jeg oprindeligt var inde på. Og hvis man så logger tidspunktet kan man jo sammenligne de informationer hvis en fejl opstår.
men jeg kan så forstå at der ikke er nogen af jer der logger den slags.
Avatar billede hlt Juniormester
30. oktober 2010 - 12:35 #30
Ja ja, den er jeg med på på. Det var om der var en måde igennem nlog hvorpå man kunne gemme de informationer.
Jeg ved godt hvordan man henter informationerne ud via koden :-)

men jeg har fundet en løsning, hvis der er andre der ude som skulle sidde med samme problem på et tidspunkt. Løsningen er at man i global.asax filen tilføjer de informationer til de exception der logges. Jeg har så valgt at lave det med html kode så hvis man vil præsentere det på en side, vil det stå pænt.
Så her er min kode i global.asax:
----------------------
Dim lastexception As Exception = Server.GetLastError()
        Dim logger As NLog.Logger = NLog.LogManager.GetCurrentClassLogger()
        Dim clientString As New StringBuilder
        clientString.AppendLine("<!-- //-------Error info start------- // -->")
        clientString.AppendLine("<table>")
        clientString.AppendLine("<tr><td>Client IP: </td><td>" & Request.ServerVariables("remote_addr") & "</td></tr>")
        clientString.AppendLine("<tr><td>Local adress: </td><td>" & Request.ServerVariables("LOCAL_ADDR") & "</td></tr>")
        clientString.AppendLine("<tr><td>Server info: </td><td>" & Request.ServerVariables("ALL_HTTP") & "</td></tr>")
        clientString.AppendLine("<tr><td>Error description: </td><td>" & lastexception.ToString & "</td></tr>")
        clientString.AppendLine("</table>")
        clientString.AppendLine("<!-- //-------Error info end-------// -->")
        logger.Fatal(clientString.ToString)
---------------------

Og tak for hjælpen
Avatar billede bkp Nybegynder
30. oktober 2010 - 12:40 #31
Der er en del server og asp parametre du kan returnere, har du tjekket om det er dem du søger?
http://nlog-project.org/wiki/Layout_Renderers
Avatar billede bkp Nybegynder
30. oktober 2010 - 12:41 #32
Det er dem her jeg tænker på:
${asp-application} - ASP Application variable.
${aspnet-application} - ASP.NET Application variable.
${aspnet-request} - ASP.NET Request variable.
${aspnet-session} - ASP.NET Session variable.
${aspnet-sessionid} - ASP.NET Session ID.
${aspnet-user-authtype} - ASP.NET User variable.
${aspnet-user-identity} - ASP.NET User variable.
${asp-request} - ASP Request variable.
${asp-session} - ASP Session variable.
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
Kurser inden for grundlæggende programmering

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