Klasa logująca w C#
by Nazgul
Chciałem zaprezentować moją klasę ułatwiającą obsługę logowania w .NET, klasa ta napisana jest w c# jak sugeruje tytuł (:
Kod umieszczam na licencji cc by
using System;
using System.Collections.Generic;
using System.IO;
namespace Nazgul.Helpers
{
//Enumeracja priorytetów
public enum LogPriority{
Exception,
Error,
Normal,
Log
}
public class Log
{
//Klasa przechowująca TextWriter oraz jego priorytet.
protected sealed class LogStream
{
public TextWriter Out { get; set; }
public LogPriority Priority { get; set; }
}
List<logstream> outs = new List<logstream>(5); //Lista strumieni
LogPriority currentPriority = LogPriority.Error; //Bieżący priorytet
static readonly Log instance = new Log();
public static Log Instance
{
get{ return instance; }
}
//Konstruktory dla singletonu.
static Log(){}
Log() { }
//Funkcja dodaje strumień do kolekcji
public Log RegisterStream(Stream stream, LogPriority priority)
{
if (stream != null)
{
outs.AddRange(new LogStream[] { new LogStream() { Out = new StreamWriter(stream), Priority = priority } });
}
return this;
}
public Log RegisterStream(Stream stream)
{
this.RegisterStream(stream, LogPriority.Log);
}
public Log RegisterStream(TextWriter tw, LogPriority priority)
{
if (tw != null)
{
outs.AddRange(new LogStream[] { new LogStream() { Out = tw, Priority = priority } });
}
return this;
}
public Log RegisterStream(TextWriter tw)
{
this.RegisterStream(tw, LogPriority.Log);
}
public Log SetPriority(LogPriority prior)
{
this.currentPriority = prior;
return this;
}
private void Write(string text)
{
foreach (LogStream ls in this.outs)
{
if (this.currentPriority >= ls.Priority)
{
ls.Out.Write(text);
ls.Out.Flush();
}
}
}
public Log EndLine()
{
this.Write(Environment.NewLine);
return this;
}
public Log Message(string text)
{
this.Write(text);
return this;
}
public Log Message(Exception ext)
{
//Tutaj należy dodać kod w lepszy sposób opisujacy wyjatek.
this.Write(ext.ToString());
return this;
}
}
}
Czysto, prosto i przyjemnie? Ale co jeśli się okaże, że uruchomiłęś duży projekt i nagle Twój log rośnie po 1GB dziennie. Kiszka, prawda? Przydało by się wyłączyć jakieś składowe, aby nie zapychały logów, a zostawić tylko te newralgiczne?
A może jeszcze pójść dalej i skierować szybko logi do innego medium niż plik na dysku?
Jak to zrobić? Ano wystarczyć używać NLog’a, który wszystko to ma, jest baaaaaaaardzo łatwy w użyciu, a na dodatek bardzo szybki (nie zamula tak jak spasiony log4net). :)
http://nlog-project.org/home
Dodam jeszcze tylko, że to polski produkt :)
Może popełniłem błąd, nie dając instrukcji jak używać to klasę, ale jak najbardziej obsługuje ona każdy rodzaj strumienia, nie musi to być plik na dysku, a także umożliwia logowanie tylko zdarzeń o danym priorytecie.
Zdaje sobie sprawę, ze moja klasa może nie nadawać się do dużych projektów, bo nie w tym celu była pisana :)