Laden...

Logging, Trace, TextTraceListener, ggf. XMLTraceListener

Erstellt von Oliver Stippe vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.673 Views
O
Oliver Stippe Themenstarter:in
120 Beiträge seit 2009
vor 8 Jahren
Logging, Trace, TextTraceListener, ggf. XMLTraceListener

Hallo Zusammen,

Mein Ziel ist lediglich 3 Kategorien von Logging Files zu erzeugen.

2016-02-07-Log-All.log

2016-02-07-Log-Error.log

2016-02-07-Log-Warning.log

Konfiguration des Pfades sollte noch möglich . Also täglich ein neues File. Das ist alles.

Was verstehe ich nicht?

Innerhalb meiner Funktionen rufe ich ja nur

Trace.Writeln auf.

Müsste ich da nicht auch was machen? Woher soll ich dann wissen, welcher Listener aktiv ist. Müsste ich dann 3 Listener erzeugen, für jede Kategorie?

TraceWarning.Writeln

TraceAll.Writeln

TraceError.Writeln

Es wäre sehr nett, wenn mir jemand die korrekte Vorgehensweise aufzeigen würde. Log4Net möchte ich nicht nehmen, denke, das müsste mit dem Standard umzusetzen sein, oder nicht?

Wann würde sich der XMTraceListener anbieten,
welche Vorteile hätte man mit diesem?

Grüße Oliver

3.003 Beiträge seit 2006
vor 8 Jahren

Wenn (falls, bei deinem kryptischen Post ist das Glückssache) ich dich richtig verstehe, willst du einen TraceListener, der abhängig vom Inhalt, der geschrieben wird, in eines von drei verschiedenen Logfiles schreibt?

Den müsstest du dir dann schon selber schreiben. Drei Listener halte ich für Unfug - ein Listener mit drei Files (und der Logik, den richtigen Inhalt in die richtige Datei zu schubsen).

Aber wie gesagt:

TraceWarning.Writeln
TraceAll.Writeln
TraceError.Writeln

Hut ab vor demjenigen, der sofort weiß, was du willst.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

O
Oliver Stippe Themenstarter:in
120 Beiträge seit 2009
vor 8 Jahren

Hallo,
ich will einfach den gesamten Ablauf in eine Logdatei haben. Ja.
Dann wäre mein Ansatz gewesen, für Fehler, Infos jeweils eine gefilterte separate Datei zu haben bzw. zu schreiben, um den Anwender es einfacher zu machen.

Wenn jemand mir die Vorgehenweise mitteilen kann, wie es übersichtlich alles in eine Datei zu schreiben wäre, sehr gerne.
Wie kann ich dann filtern, um den Fehler einzugrenzen.
Ich möchte ja die Anwendung nicht starten, zunächst mit Schalter, Error, dann mit Info, etc.

Wie kann ich täglich eine neue Datei schreiben? Wie würde das gehen?

Grüße Oliver

16.807 Beiträge seit 2008
vor 8 Jahren

Eigentlich filtert man Logs im nachhinein, weniger davor.
Du weißt ja oft nicht, nach was Du überhaupt filtern willst. Deswegen ist XML für Logs relativ praktisch, da es sich sehr einfach maschinell auslesen lässt.

O
Oliver Stippe Themenstarter:in
120 Beiträge seit 2009
vor 8 Jahren

Hallo Zusammen,
ok, wenn eine App in der Regel bei Euch 1 Log Datei aufweist.
OK.

Meine Bitte wäre noch mir aufzuzeigen, wie ich über den vorhandenen
TextWriter oder XMLWriter Listener täglich zumindest eine neue Datei schreiben kann, ohne großen Aufwand.

2016-02-08-Process.Log

Sehr gerne auch noch ein Beispiel mit XML, wenn da im nachhinein, das Filtern einfacher, effektiver ist.

Vielleicht kennt Ihr ein kleines Beispielprojekt.

DANKE.

Grüße Oliver

3.003 Beiträge seit 2006
vor 8 Jahren

Hallo Zusammen,
ok, wenn eine App in der Regel bei Euch 1 Log Datei aufweist.

Durchaus nicht. Allerdings wird nach Herkunft der Meldung sortiert, nicht nach Inhalt. Letzteres kann und soll ein Loggingmechanismus eigentlich nicht leisten - er soll schlicht Informationen, die er erhält, wegspeichern, ohne sich um den Inhalt zu scheren.

Und wo wir gerade dabei sind: den Tracing-Mechanismus für Logging zu benutzen, ist meiner Meinung nach auch ein Missbrauch. Tracing ist für das Verfolgen (sic!) von Code-Ausführung gedacht. Klar kann man das auch zum Protokollieren benutzen. Aber mit einem Schraubenzieher einen Nagel in die Wand zu hauen, geht auch. Du bist da, denke ich, auf einem Holzweg.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

O
Oliver Stippe Themenstarter:in
120 Beiträge seit 2009
vor 8 Jahren

Hallo,


// ersten Listener registrieren
TextWriterTraceListener listenerA = 
   new TextWriterTraceListener(@"C:\A.txt", "ListenerA");
Trace.Listeners.Add(listenerA);
// zweiten Listener registrieren
TextWriterTraceListener listenerB = 
   new TextWriterTraceListener(@"C:\B.txt", "ListenerB");
Trace.Listeners.Add(listenerB);
Trace.WriteLine("Erste Information");
// in beide Listener schreiben
listenerA.Flush();
listenerB.Flush();
// listenerB deregistrieren
Trace.Listeners.Remove("ListenerB");
Trace.WriteLine("Zweite Information");
listenerA.Flush();

OK, ich hab's verstanden. Man könnte mehrere definieren, dann schreiben alle über Trace.Writeln in eine Datei.

Ich möchte diesen über die Config aktiv schalten.
Geht nicht.



public class MyTraceListener : System.Diagnostics.TextWriterTraceListener
    {
        string _fileName;
        System.DateTime _currentDate;
        System.IO.StreamWriter _traceWriter;

        public MyTraceListener(string fileName)
        {
            // Pass in the path of the logfile (ie. C:\Logs\MyAppLog.log)
            // The logfile will actually be created with a yyyymmdd format appended to the filename
            _fileName = fileName;
            _traceWriter = new StreamWriter(generateFilename(), true);
        }

        public MyTraceListener(string fileName, string name ):base (fileName, name)
        {
            // Pass in the path of the logfile (ie. C:\Logs\MyAppLog.log)
            // The logfile will actually be created with a yyyymmdd format appended to the filename
            _fileName = fileName;
            _traceWriter = new StreamWriter(generateFilename(), true);
        }

        public override void Write(string value)
        {
            checkRollover();
            _traceWriter.Write(value);
        }

        public override void WriteLine(string value)
        {
            checkRollover();
            _traceWriter.WriteLine(value);
        }

        private string generateFilename()
        {
            _currentDate = System.DateTime.Today;

            string ret = Path.Combine(Path.GetDirectoryName(_fileName), Path.GetFileNameWithoutExtension(_fileName) + "_" + _currentDate.ToString("yyyyMMdd") + Path.GetExtension(_fileName)); 
            return ret;
        }

        private void checkRollover()
        {
            // If the date has changed, close the current stream and create a new file for today’s date
            if (_currentDate.CompareTo(System.DateTime.Today) != 0)
            {
                _traceWriter.Close();
                _traceWriter = new StreamWriter(generateFilename(), true);
            }
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                _traceWriter.Close();
            }
        }
    }



 <system.diagnostics>
    <sources>
	 <trace autoflush="true"/>
      <source name="LoggerApp" switchName="sourceSwitch" switchType="System.Diagnostics.SourceSwitch">
        <listeners>
          <add name="myListener" type="Communication.Definitions.Core.MyTraceListener" initializeData="C:\Log\myListener.log" />
        </listeners>
      </source>
    </sources>
    <switches>
      <add name="sourceSwitch" value="4" />
    </switches>
  </system.diagnostics>

Es kommt, kann den Typ "Communication.Definitions.Core.MyTraceListener"
nicht finden.
Er ist da, Verweis.

Sieht jemand etwas?

Grüße Oliver

2.207 Beiträge seit 2011
vor 8 Jahren

Hallo Oliver Stippe,

erstmal würde ich dich gern bitten mal Beiträge zu erfassen, die klare Sätze beinhalten aus denen man lesen kann, was du willst. So sind das zusammenhangslose Satzfetzen aus denen wir suchen müssen, was du willst.

Konfiguration des Pfades sollte noch möglich . Also täglich ein neues File. Das ist alles.

Er ist da, Verweis.

Weiter wälze bitte die Arbeit nicht aufs Forum ab. Du fragst nach Beispielen, die dir keiner geben wird und die Lösung hast du schon bekommen.

Ausserdem verstehe ich nicht so ganz, was du willst. Eine Datei oder drei Dateien?

Mein Ziel ist lediglich 3 Kategorien von Logging Files zu erzeugen.

ich will einfach den gesamten Ablauf in eine Logdatei haben. Ja.

Ja = Ich habe mich aufgrund der Hinweise umentschieden? Oder ja = was andres?

Wenn du aufgrund der LogLevel in verschiedene Files schreiben willst musst du das selber bauen. Das hat LaTino aber schon gesagt. Willst du ein File haben, dann tagge die Einträge entsprechend. Um sowas zu filtern gibts Tools.

Für den Verweisfehler: [FAQ] CS0234 / CS0246 - Der Typ- oder Namespacename "Foo" konnte nicht gefunden werden

Gruss

Coffeebean