Hallo
Ich habe versucht mal eine kleine Klasse wür ein "logging" zu erstellen.
Meine Forderung ist.
Einfach soll er sein 😁
Ich soll leicht von überall darauf zugreifen können.
Mein Idee ist:
public class Logger : IDisposable
{
/// <summary>
///
/// </summary>
private StreamWriter logFile;
/// <summary>
///
/// </summary>
private static Logger instance;
/// <summary>
///
/// </summary>
private Logger(string fileName)
{
logFile = new StreamWriter(fileName, false, Encoding.Default);
}
/// <summary>
///
/// </summary>
/// <param name="fileName"></param>
public static void CreateLogger(string fileName)
{
if (instance == null)
instance = new Logger(fileName);
else
throw new Exception("Nur eine Instanz erlaubt!");
}
/// <summary>
///
/// </summary>
public void Dispose()
{
logFile.Close();
}
/// <summary>
///
/// </summary>
/// <param name="message"></param>
public void Log(string message)
{
logFile.WriteLine(message);
}
/// <summary>
///
/// </summary>
public static Logger GetLogger
{
get
{
return instance;
}
}
}
Ist das so gut oder hat mein logger einen Hacken den ich noch nicht sehe ?
Z.b Was passiert wenn mein Programm plötzlich abstürtzt ?
Kann es dann passieren das einige Sachen nicht geloggt wurden ? D.h ich sollte besser noch Flush nutzen ?
Wird im falle eines Absturzes die Datei auch geschlossen ?
Weil Dispose wird bei einem Absturtz nicht mehr aufgerufen oder ?
Geht es einfacher? =)
Gruß
Martin
Hallo martin_zi,
Teilantwort:
Kann es dann passieren das einige Sachen nicht geloggt wurden ? D.h ich sollte besser noch Flush nutzen ?
ja
Wird im falle eines Absturzes die Datei auch geschlossen ?
ja
Weil Dispose wird bei einem Absturtz nicht mehr aufgerufen oder ?
richtig
herbivore
falls du einen logger suchst, log4net ist excellent. aber natürlich kann mans bei neuen und eigenen projekten von anderen seiten her angehen, die auch wieder vorteile haben können.
loop:
btst #6,$bfe001
bne.s loop
rts
Hi,
um es einfach zu halten habe ich meinen Logger statisch gemacht.
Dadurch ist es mir möglich ihn überall aufzurufen, wo ich es möchte ohne eine Instanz zu erstellen.
Zusätzlich würde ich den Inhalt immer über die System.IO.File Klasse schreiben und keinen StreamWriter nutzen. Dadurch musst du auch kein öffnen oder schließen aufrufen.
Gruß, maYer
Wie 0815Coder schon sagte: Wenn du wirklich einen Logger für den praktischen Einsatz brauchst, dann spare dir die Arbeit den selbst zu schreiben, und nehme einen fertigen (log4net wäre auch meine Empfehlung).
log4net ist weitaus besser als die Loggging-API von .NET (hast du dir die schonmal angesehen?).
Original von martin_zi
Einfach soll er sein 😁
Ich soll leicht von überall darauf zugreifen können.
Also ich habe einen Logger, bei dem ich einen Singleton Designpattern benutze, dann kann ich auch von überall darauf zugreifen und es ist sicher gestellt, dass es nur einen Logger gibt.
Der Aufruf kann dann von überall aus folgendermaßen erfolgen:
Logger.Instance.WriteLog(text);
Ist eben Geschmackssache, bei allen Projekten wird das bestimmt nicht sinnvoll sein, aber ich bin bis jetzt ganz zufrieden so wie ich ihn gemacht habe.
Mfg Preli
Hi
log4net schreibt aber bloß in eine Textdatei.
Ich hätte aber lieber ein kleines Fenster daher habe ich es dann selber gemacht.
Gruß
Martin
Hallo martin_zi,
ich gehe schwer davon aus, dass mal mit log4net überall dorthin loggen kann, wo man will.
herbivore
ich hätte mal eine andere frage:
du willst:
log4net schreibt aber bloß in eine Textdatei.
Ich hätte aber lieber ein kleines Fenster daher habe ich es dann selber gemacht.
und du machst:
private Logger(string fileName) { logFile = new StreamWriter(fileName, false, Encoding.Default); }
wo genau is jetzt der unterschied ob du vom log4net die datei nimmst oder deine ? oder hab ich was nicht mitbekommen?
lg
lg Lion
Hallo Lion1984,
ich denke, martin_zi wüsste, was er in seinem Logger ändern müsste, damit in eine TextBox geloggt wird, aber meint, dass das mit log4net nicht möglich wäre. Das halte ich aber für einen Irrtum. Ich bin mir sicher, dass man auch mit log4net in eine TextBox loggen kann.
herbivore
hallo herbivore,
ich denke wenn man so eine klasse macht, dann weißt man das, also bin ich deiner meinung, aber ich hab jetzt die "kritik" an log4net nicht verstanden, da er selbst auch in eine textdatei loggt.
lg
lg Lion
hab kurz auf Log4net Doku rübergeschaut... Am ehesten könnte man mit hilfe des MemoryAppenders in eine Textbox loggen. Wenn nicht, dann reichts, nur einen "TextboxAppender" zu schreiben, und los gehts mit allen anderen Vorteilen von log4net.
loop:
btst #6,$bfe001
bne.s loop
rts
Hi
Das obige Beispiel war ja bloß mal umd die "Struktur" des Loggers zu überlegen.
Original von herbivore
Hallo Lion1984,ich denke, martin_zi wüsste, was er in seinem Logger ändern müsste, damit in eine TextBox geloggt wird, aber meint, dass das mit log4net nicht möglich wäre. Das halte ich aber für einen Irrtum. Ich bin mir sicher, dass man auch mit log4net in eine TextBox loggen kann.
herbivore
So wie herbivore meinte.
Und als ich die Dokus von log4net durchgelesen habe sah ich auf die schnelle,
dass log4net Hauptsächlich in eine Textdatei schreibt. Was aber nicht mein Ziel ist.
Ich will verschiedene Threads starten und alle loggen in ein Textfenster und in eine
Textdatei....
Kann man das mit log4net auch einfach machen ??
Ich tat mir halt leichter einen eigene Klasse speziel dafür zu bauen ... =)
Gruß
Martin
Hallo martin_zi,
Kann man das mit log4net auch einfach machen ??
die Frage hat doch 0815Coder im Prinzip schon beantwortet. Ich denke nicht, dass es schwierig ist, einen Appender zu schreiben.
herbivore
Hi
Nur was 0815Coder sagte hab ich nicht wirklich verstanden. 😁
http://logging.apache.org/log4net/release/sdk/log4net.Appender.html
Z.b müsste ich dann alle paar Sekunden vom MemoryAppender was abholen ?
Gruß
Martin
Hallo martin_zi,
verbeiße dich nicht in den MemoryAppender. 0815Coder schreib ja auch
Wenn nicht, dann reichts, nur einen "TextboxAppender" zu schreiben
herbivore
Achso einfach für eine selbstgebaute Klasse das Interface IAppender
implementieren ? 😁
Gruß
Martin
Hallo martin_zi,
so würde ich das sehen.
herbivore
ps:
ich hab sowas noch nie gemacht - aber das wäre mein tipp...
loop:
btst #6,$bfe001
bne.s loop
rts
Alles klar werde ich auch mal probieren ...
Thx für den Tipp
Gruß
Martin
Hallo
Ich hatte jetzt noch einmal Zeit mir das anzusehen 🙂.
Eventuell noch etwas verfeinerungswürdig 😉
Mir ging es nur darum wie ich es lösen würde:
Ich habe jetzt ganz einfach von der Klasse AppenderSkeleton abgeleitet. Erschien mir am einfachsten.
LogViewer ist ein einfachs Form mit einer "RichtextBox".
public class MyAppender : AppenderSkeleton
{
/// <summary>
///
/// </summary>
static private LogViewer logViewer;
/// <summary>
///
/// </summary>
public MyAppender()
{
logViewer = new LogViewer();
logViewer.Show();
}
protected override void Append(log4net.Core.LoggingEvent loggingEvent)
{
logViewer.richTextBox1.AppendText(loggingEvent.MessageObject.ToString()+"\n");
logViewer.richTextBox1.Update();
}
}
Die Config datei dazu:
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="MyAppender" type="LogForNetTextBoxAppender.MyAppender">
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="MyAppender" />
</root>
</log4net>
Und schon kann man damit arbeiten.
System.IO.FileInfo configFileInfo = new System.IO.FileInfo("log4Net.config");
log4net.Config.XmlConfigurator.Configure(configFileInfo);
logger.Error("ERROR");
logger.Info("INFO");
Geht recht gut und ist einfach 😁
👅
Gruß
Martin
cool... vielleicht brauch ichs selber mal 🙂
loop:
btst #6,$bfe001
bne.s loop
rts
Hallo martin_zi,
Habe deinen Code hier gefunden für das Problem mit dem schreiben in eine RichTextBox. Nun habe ich aber Probleme sie bei mir einzubauen. Meine erste Frage ist wo schreibt man die Klasse MyAppender hin, so dass log4net sie auch findet.