Listener - InitializeData mit Platzhalter?

24/09/2007 - 10:20 von Norbert Pürringer | Report spam
Hallo Leute,

ich möchte gerne über die Konfigurationsdatei angeben, was für einen
TraceListener ich haben möchte. Da ich gerne die Meldungen in einer
Textdatei haben möchte, ist es wohl naheliegend, den
TextWriterTraceListener zu verwenden. Bei InitializeData steht der
Name der Textdatei. Gibt es eine Chance, den Namen dynamisch
zusammenzustellen? Ich würde gerne im Dateinamen noch das heutige
Datum stehen haben. Vielleicht gibt es einen Platzhalter fürs Datum
oder sowas Ähnliches? Weiß jemand Bescheid?

<system.diagnostics>
<trace autoflush="true" indentsize="2">
<listeners>
<remove name="Default"/>
<add name="TextWriterListener"
type="System.Diagnostics.TextWriterTraceListener,System"
initializeData="C:\temp\TextWriter20070924.log" />
</listeners>
</trace>
</system.diagnostics>

Hoffentlich muss nicht ein eigener Listener für das Datum im
Dateinamen geschrieben werden. :-)

Gruß,
Norbert
 

Lesen sie die antworten

#1 Elmar Boye
25/09/2007 - 21:21 | Warnen spam
Hallo Norbert,

Norbert Pürringer schrieb ...
ich möchte gerne über die Konfigurationsdatei angeben, was für einen
TraceListener ich haben möchte. Da ich gerne die Meldungen in einer
Textdatei haben möchte, ist es wohl naheliegend, den
TextWriterTraceListener zu verwenden. Bei InitializeData steht der
Name der Textdatei. Gibt es eine Chance, den Namen dynamisch
zusammenzustellen?



Nein, das ist dort festverdrahtet. Das einzige was der Listener
macht, ist eine Guid anzuhàngen, falls die Ausgabedatei bereits
in Benutzung ist - siehe Dokumentation.

Ich würde gerne im Dateinamen noch das heutige
Datum stehen haben. Vielleicht gibt es einen Platzhalter fürs Datum
oder sowas Ähnliches?



Das kann man aber nachrüsten. Unten mal beispielhaft, wie das
aussehen könnte. Um ihn einzubinden, verwende:

<!-- CSApp durch Assembly Namen ersetzen -->
<add name="DateTextWriterTraceListener"
type="ElmarBoye.Samples.Diagnostics.DateTextWriterTraceListener,CSApp"
initializeData="%TEMP%\OUTPUT.LOG" />
</listeners>

und setze anstatt CSApp den Namen der Assembly ein, in der der
Listener anhalten ist - das kann im ausgeführten Programm sein.

Gruss
Elmar

///
using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Globalization;

namespace ElmarBoye.Samples.Diagnostics
{
public class DateTextWriterTraceListener : System.Diagnostics.TraceListener
{
private const int MAX_RETRIES = 10; // Anzahl Öffnungsversuche

private StreamWriter outputStream;
private string initialFileName;
private System.DateTime currentDate;

public DateTextWriterTraceListener(string fileName)
{
// Erweitern von %TEMP% usw.
if (!string.IsNullOrEmpty(fileName))
this.initialFileName = Environment.ExpandEnvironmentVariables(fileName);
this.currentDate = DateTime.MinValue;
}

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

public override void Close()
{
if (this.outputStream != null)
{
this.outputStream.Close();
this.outputStream = null;
}
}

public override void Flush()
{
if (this.ValidateOutput())
this.outputStream.Flush();
}

public override void Write(string value)
{
if (ValidateOutput())
{
CheckIndent();
this.outputStream.Write(value);
}
}

public override void WriteLine(string value)
{
if (ValidateOutput())
{
CheckIndent();
this.outputStream.WriteLine(value);
base.NeedIndent = true;
}
}

private void CheckIndent()
{
if (base.NeedIndent)
{
base.WriteIndent();
}
}

private bool ValidateOutput()
{
// Offene Datei und heutiges Datum
if (this.outputStream != null
&& this.currentDate.CompareTo(DateTime.Today) == 0)
return true;

// Kein Dateiname vorgegeben oder (unten) fehlgeschlagen
if (String.IsNullOrEmpty(this.initialFileName))
return false;

this.Close();

// Dateiname um Datum erweitern
// und ggf. mit laufender Nummer bestimmen
this.currentDate = DateTime.Today;
for (int retry = 0; retry < MAX_RETRIES; retry++)
{
try
{
string fileName = Path.Combine(
Path.GetDirectoryName(this.initialFileName),
Path.GetFileNameWithoutExtension(this.initialFileName)
+ this.currentDate.ToString("yyyymmdd", CultureInfo.InvariantCulture)
+ (string)((retry != 0) ? "_" + retry.ToString(CultureInfo.InvariantCulture) : String.Empty)
+ Path.GetExtension(this.initialFileName));

try
{
this.outputStream = new StreamWriter(fileName, true, new UTF8Encoding(false), 4096);
return true;
}
catch (IOException)
{
// nàchste Nummer wenn Datei belegt (mehrere Instanzen)
}
}
catch (Exception)
{
break;
}
}

// Kein Erfolg... nicht weiter versuchen
this.initialFileName = null;
return false;
}
}
}
\\\

Ähnliche fragen