Über das aktuelle AppHelper-Objekt Aph.Current steht eine Möglichkeit zur Verfügung, Trace-Anweisungen in die Software einzubauen.
Zur Laufzeit kann jederzeit die Traceausgabe für Programme aktiviert werden, sodass die zusätzlichen Traceinformationen in Traceprotokolle ausgegeben werden.
Über einen Trace-Viewer können solche Traceprotokolle angezeigt und über verschiedene visuelle Möglichkeiten durchsucht und analysiert werden.
Bei der Ausgabe von Tracemeldungen muss eine Klassifizierung stattfinden, zu welchem "Tracelevel" die auszugebene Meldung gehört.
Dafür stehen 4 Level zur Auswahl:
Basis: Tracezeilen werden immer angezeigt. Hier sollten z.B. alle Datei oder Datenbankzugriffe zu sehen sein.
Extended: Erweiterte Informationen. Hier kann nach einem Datei oder Datenbankzugriff z.B. der gelesene Inhalt protokolliert werden.
Intern: Ist vorgesehen für Internen Trace von Basisklassen. Hier können Ausgaben erfolgen, die Aufschluss darüber geben, welche internen Basisklassen durchlaufen wurden.
Perf: Ist vorgesehen für die Ausgabe von Perfoamnce-Countern. Dieser Typ hat eine spezielle Funktion, und sollte außer von PerformanceCounter nicht verwendet werden.
Beim Aktivieren von Traceausgaben kann eingestellt werden, welcher Traceumfang ausgegeben werden soll.
Dabei stehen neben den oben genannten Klassifizierungen zusätzlich die Möglichkeiten "all" und "stack" zur Verfügung.
"all" Legt fest, dass die Traceausgabe alle Zeilen enthalten soll. (Außer Perf)
"stack" Legt fest, dass zusätzlich bei jeder TraceZeile ein Callstack ausgegeben wird. Der Callstack erlaubt die Analyse, an welcher Stelle in den Programme eine Trace-Zeile entsteht, und wie das Programm dort hin gekommen ist. Bei Aktivierung von "stack" wird aber die Laufzeit der Programme dramatisch verschlechtert. Daher sollte "stack" nur auf besondere Anforderung hin genutzt werden. Wird "Stack" verwendet erfolgt keine Ausgabe von "Perf" Zeilen.
Hinweis: ALLE IO-Operationen, Datenbank und Netzwerkzugriffe sollen im Traceprotokoll verzeichnet sein. Verwenden Sie daher immer Routinen aus z.B. FileHelper um Dateien zu lesen, zu schreiben oder auf deren Existenz zu prüfen. Die FileHelper Routinen haben Trace-Ausgaben (und PerformanceCounter) integriert.
Im folgenden finden sich Beispiele für die Ausgabe von Zeilen in die Trace-Protokolle:
Trc.WriteLine(Trc.LevelBase(), "ShowDocument filename={0} verb={1}", filename, verb);
Damit das funktioniert, muss das Trc-Objekt folgendermaßen definiert sein:
public static SOGTrc Trc => AppHelper.Current.Trc;
Mit der folgenden Anweisung kann abgefragt werden, ob das Programm Traceausgaben durchführt.
DAS SOLLTE NUR VERWENDET WERDEN, UM SELBST TRACEAUSGABEN DURCHZUFÜHREN UND GGF. DIE PROGRAMMPERFORMANCE ZU VERBESSERN WENN KEIN TRACE AKTIV IST.
KEINESFALLS DÜRFEN HIER DATEN ODER AUCH NUR DATENFELDER VERÄNDERT WERDEN DA SICH DAS PROGRAMM SONST MIT UND OHNE TRACE UNTERSCHIEDLICH VERHALTEN WÜRDE.
if (Aph.TraceEnabled)
{
Trc.WriteLine(Trc.LevelBase(), "ShowDocument filename={0} verb={1}", filename, verb);
}
Start und Ende von Bausteinen ins Traceprotokoll schreiben
Mit der Funktion "EntryAndExit" kann der Einstieg und das Verlassen eines Bausteins ins Traceprotokoll geschrieben werden.
Verwenden Sie die "using" Syntax damit sichergestellt ist, dass das Verlassen des Bausteins wirklich und an der richtigen Stelle in den Trace geschrieben wird.
public int NaechsteNummer()
{
using (Trc.EntryAndExit())
{
// Bausteincode
}
}
Alternativ kann der TraceLevel auch als Parameter übergeben werden. Standard ist "Base".
public int NaechsteNummer()
{
using (Trc.EntryAndExit(SOGTrc.TraceLevel.Extended))
{
// Bausteincode
}
}
Resharper-Template zum Bausteintrace
Für Resharper steht ein Template zur Verfügung, mit dem schnell und einfach eine EntryAndExit-Traceanweisung in den Quellcode eingefügt werden kann.
Dazu muss der komplette Methodenrumpf markiert werden und das Template "trcentry" unter "Surround with" im Kontext-Menü von Resharper ausgewählt werden.
Beispiel: