Toon posts:

[c#] trace listener

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo

ik heb een programma in c# met verschillende class-files
ik heb overal foutopvanging ingebouwd met een try-catch
nu wil ik een eventuele fout loggen in een text-file.
Nu is dat geen probleem met een listener
dus ik creeer in iedere catch een nieuwe listener die naar dezelfde file verwijst (pad staatn in app.config)
Nu kreeg ik de foutmelding dat mijn file in gebruik was, dus deed ik in iedere catch nog een listener.dispose, maar toen kreeg ik de melding dat hij nie kan schrijven naar een gesloten file (ook al stond deze regel op het einde van de catch)
ik ga morgen de code posten want die ligt op het werk....
ik had de code van google afgehaald.
Heeft iemand al een ideetje waar dit aan zou kunnen leggen?
code volgt nog...

de code :

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
using System;
using System.Diagnostics;
using System.IO;
using System.Configuration;

namespace Kraft
{
    /// <summary>
    /// Summary description for CustomTextWriterTraceListener.
    /// </summary>
    public class CustomTextWriterTraceListener :TextWriterTraceListener
    {
        private static object dork = new Object();
        public CustomTextWriterTraceListener(string file):  base(file)
        {                 
        }

        public CustomTextWriterTraceListener(string file, string name):base(file,name)
        {
        }

        public override void Write(string message)
        {
            lock(dork)
            {
                message=DateTime.Now.ToLongTimeString() + "," +message;
                base.Write(message);
            }
        }

        public override void WriteLine(string message, string category)
        {
            lock(dork)
            {    
                message=DateTime.Now.ToLongTimeString() + "," +message + "," + category;
                base.WriteLine (message);
            }
        }

        public override void Write(string message, string category)
        {
            lock(dork)
            {
                message=DateTime.Now.ToLongTimeString() + "," +message + "," +category;
                base.Write (message);
            }
        }

        public override void WriteLine(string message)
        {
            lock(dork)
            { 
                message=DateTime.Now.ToLongTimeString() + "," +message;
                base.WriteLine(message);
            }
        }
    }

    public class TraceLog
    {
        public static CustomTextWriterTraceListener myWriter;
        static TraceLog()
        {        
            // logfile-pad ophalen uit app.config
            String traceString = ConfigurationSettings.AppSettings["MyTraceDir2"];

            myWriter =new  CustomTextWriterTraceListener(traceString);
            Trace.Listeners.Add(myWriter);
        }
    }

}


aanroep:
code:
1
2
3
4
    TraceLog.myWriter.WriteLine("record inserted");
    TraceLog.myWriter.Flush();
    //TraceLog.myWriter.Close();
    TraceLog.myWriter.Dispose();


de aanroep gebeurd in een "finally" en zit in een lus dus gebeurt meerdere malen.

[ Voor 60% gewijzigd door Verwijderd op 02-11-2005 09:57 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:12
Het probleem is, dat je telkens een nieuwe listener maakt die dezelfde file gebruikt. De eerste listener heeft dus een lock op die file.
Waarom gebruik je niet iedere keer dezelfde listener, of roep je de 'Close' method aan als je gedaan hebt met schrijven.

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op dinsdag 01 november 2005 @ 22:02:
Het probleem is, dat je telkens een nieuwe listener maakt die dezelfde file gebruikt. De eerste listener heeft dus een lock op die file.
Waarom gebruik je niet iedere keer dezelfde listener, of roep je de 'Close' method aan als je gedaan hebt met schrijven.
ok
ik ga dat morgen uitproberen, moest het toch nog niet lukken hoor je me weer...

  • stp_4
  • Registratie: Maart 2003
  • Laatst online: 12-04 16:17
offtopic:
Misschien is log4net wel interessant

stp - PSN ID: stp_4


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

log4net of gewoon een singleton class die threadsafe is...

ASSUME makes an ASS out of U and ME


Verwijderd

Topicstarter
HIGHGuY schreef op dinsdag 01 november 2005 @ 23:28:
log4net of gewoon een singleton class die threadsafe is...
ik heb een aparte class aangemaakt maar krijg nog steeds de fout, zie code boven

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:12
Sluit je die tracelistener wel af, of, maak je steeds gebruik van dezelfde instantie ?

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op woensdag 02 november 2005 @ 11:14:
Sluit je die tracelistener wel af, of, maak je steeds gebruik van dezelfde instantie ?
ik heb een close() gedaan , een dispose() en een combinatie...

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

je weet wat een singleton class is ? want dan kan je dat probleem niet hebben.

zoek eens op het singletong pattern

ASSUME makes an ASS out of U and ME


Verwijderd

Verwijderd schreef op dinsdag 01 november 2005 @ 21:58:
aanroep:
code:
1
2
3
4
    TraceLog.myWriter.WriteLine("record inserted");
    TraceLog.myWriter.Flush();
    //TraceLog.myWriter.Close();
    TraceLog.myWriter.Dispose();


de aanroep gebeurd in een "finally" en zit in een lus dus gebeurt meerdere malen.
Het is niet de bedoeling dat je de myWriter elke keer gaat closen en gaat disposen. Bovendien mag je in .NET een gedisposed object niet meer aanspreken.

Wat jij moet doen is het volgende:

1. De TraceLog class is overbodig. In die class zit maar één regel die nuttig is. Deze regel kun je ook aan het begin van je applicatie opnemen (in de Main) of configureren in web.config/app.config. De regel waar het om gaat is:
code:
1
Trace.Listeners.Add(new CustomTextWriterTraceListener(traceString));

Je geeft zelf aan dat je het pad voor de listener ophaalt uit de app.config. Het is aan te raden om de bovengenoemde regel helemaal niet in code op te nemen en de Tracer in app.config volledig te configureren. Voorbeelden hoe dat moet heb ik niet bij de hand, maar MSDN zal je vast verder helpen.

2. Nadat je de vorige stap hebt uitgevoerd moet je bij het wegschrijven naar de trace file, de volgende code gebruiken:
code:
1
Trace.WriteLine(.....);

Deze regel zorgt ervoor dat alle listeners die zijn aangemeld, de nuttige mededeling verwerken.

3. Ergens aan het eind van de applicatie, moet je (slechts één keer) de volgende regel schrijven:
code:
1
2
Trace.Flush();
Trace.Close(...);

Verder wil je wijzen op de AutoFlush optie die ervoor zorgt dat na elke trace write, alle trace buffers worden leeggemaakt en naar disk wordt geschreven. Als je AutoFlush niet gebruikt en je applicatie krijgt geen tijd om Trace.Close aan te roepen (bijvoorbeeld bij een crash), dan ben je alles wat nog in de buffer zat kwijt. Dit, terwijl juist de laatste trace writes vlak vóór een crash belangrijk zijn.

De reden waarom AutoFlush standaard niet aan staat is de hardeschijfbelasting die het met zich brengt.

Tot slot vraag ik mij af waarom je een custom tracer hebt geschreven. Als ik naar jouw code kijk, doet jouw tracer niets meer dan de versie die je als base gebruikt.

Verwijderd

Verwijderd schreef op woensdag 02 november 2005 @ 20:12:
[...]
...de Tracer in app.config volledig te configureren. Voorbeelden hoe dat moet heb ik niet bij de hand, maar MSDN zal je vast verder helpen.
Een werkend voorbeeldje:
XML:
1
2
3
4
5
6
7
8
 <system.diagnostics>
    <trace autoflush="true" indentsize="4">
        <listeners>
           <add name="logger" type="System.Diagnostics.TextWriterTraceListener" initializeData="C:\\Logfiles\\logbestand.txt" />
           <remove type="System.Diagnostics.DefaultTraceListener"/> 
        </listeners>
    </trace>
  </system.diagnostics>

Zorg wel dat je applicatie schrijfrechten heeft in de specifieke map.
Pagina: 1