Klasa logująca w C#

Chci­ałem zaprezen­tować moją klasę ułatwia­jącą obsługę logowa­nia 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;
        }
    }
}

No related posts.

Pow­iązane wpisy wygen­erowane przez wty­czkę Yet Another Related Posts.

Ten wpis został opublikowany w kategorii Programowanie. Dodaj zakładkę do bezpośredniego odnośnika.

3 odpowiedzi na „Klasa logująca w C#

  1. dario-g pisze:

    Czysto, prosto i przy­jem­nie? Ale co jeśli się okaże, że uru­chomiłęś duży pro­jekt i nagle Twój log rośnie po 1GB dzi­en­nie. Kiszka, prawda? Przy­dało by się wyłączyć jakieś skład­owe, aby nie zapy­chały logów, a zostawić tylko te newralgiczne?

    A może jeszcze pójść dalej i skierować szy­bko logi do innego medium niż plik na dysku?

    Jak to zro­bić? Ano wystar­czyć uży­wać NLog’a, który wszys­tko to ma, jest baaaaaaaardzo łatwy w uży­ciu, a na dodatek bardzo szy­bki (nie zamula tak jak spa­siony log4net). :)

    http://nlog-project.org/home

  2. dario-g pisze:

    Dodam jeszcze tylko, że to pol­ski produkt :)

  3. Może popełniłem błąd, nie dając instrukcji jak uży­wać to klasę, ale jak najbardziej obsługuje ona każdy rodzaj stru­mienia, nie musi to być plik na dysku, a także umożli­wia logowanie tylko zdarzeń o danym priorytecie.

    Zdaje sobie sprawę, ze moja klasa może nie nadawać się do dużych pro­jek­tów, bo nie w tym celu była pisana :)

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>