Logging.Net - Ein Logger für C#

Meine eigene Logging-Library für C#

Gepostet von Daniel Balk am 1. März 2022 Lesezeit: 6min

Weil ich eine Logging-Bibliothek mit einigen Funktionen brauche, arbeite ich an meiner eigenen.

Herunterladen

NuGet: https://www.nuget.org/packages/Logging.Net/

Sourcecode: https://github.com/Dalk-GitHub/Logging.Net

Dokumentation

1. Klassen importieren

Um Logging.Net zu benutzen, muss man die Klassen importieren.

using Logging.Net;

2. Loggertypen

In Logging.Net gibt es verschiedene Designs für Logausgaben.

2.1. Blazor ähnlicher Logger

// use a blazor like logger
Logger.UseMBLogger();

2.2. log4j ähnlicher Logger

// use a log4j like logger
Logger.UseSBLogger();

3. Logdateien

Logging.Net bietet auch Funktionen, um die Logausgaben in eine Datei zu schreiben.

3.1. Normale Logdatei

// the logs should be written to a file
Logger.LogToFile("log.log");

3.2. HTML Logdatei

Information: Eine HTML Logdatei verbracht pro Logausgabe ca. 650 Bytes zusätzlich für die Darstellung

// the logs should be written to a html file
Logger.LogToHtmlFile("log.html");

4. Logstufen

In Logging.Net gibt es die Logstufen Debug, Info, Warn und Error, die man auch einzeln deaktivieren kann.

4.1. Debug

Ausgabe auf Debug:

// log a message as debug
Logger.Debug("A debug log message...");

Ausgabe von Debug deaktivieren:

// disable debug logging
Logger.DisableDebug = true;

4.2. Info

Ausgabe auf Info:

// log a message as info
Logger.Log("A log message...");

oder

// Logger.Info(message) == Logger.Log(message)
Logger.Info("Another log message...");

Ausgabe von Info deaktivieren:

// disable info logging
Logger.DisableInfo = true;

4.3. Warn

Ausgabe auf Warn:

// log a message as warning
Logger.Warn("A warning message...");

Ausgabe von Warn deaktivieren:

// disable logging warnings
Logger.DisableWarn = true;

4.4. Error

Ausgabe auf Error:

// log a message as an error
Logger.Error("A error message..");

Ausgabe von Error deaktivieren:

// disable logging errors
Logger.DisableError = true;

5. Statusausgabe für Tasks

Weil eine Statusausgabe für Tasks auch oft benötigt wird, habe ich mich entschlossen, eine zu schreiben. Der Parameter task des Typs Action gibt den Code an, der mit einer Logausgabe ausgeführt werden soll und ist erforderlich. Der Parameter name des Typs String gibt den angezeigten Name des Tasks an. Dieser muss nicht gesetzt werden, aber es wird empfohlen diesen zu setzen. Der Parameter took des Typs Boolean gibt an, ob angezeigt werden soll, wie lange der Task gebraucht hat, um vollständig ausgeführt zu werden. Angezeigt wird es mit true , mit false nicht.

Syntax:

// task: Action
// name: String
// took: Boolean
ConsoleHelper.Run(task, name, took);

Beispiel:

ConsoleHelper.Run(() =>
{
    Logger.Info("Before sleep");
    Logger.Debug("Sleeping 1000ms");
    Thread.Sleep(1000);
    Logger.Info("After sleep");
}, "Test", true);

Ausgabe:

6. Tools für die Konsole

Weil ich öfters folgende Tools benötige, habe ich diese in Logging.Net eingebaut.

6.1. Zeile füllen

Der Parameter chr der Typs String gibt das Zeichen an, mit dem die Zeile gefüllt werden soll. Der Parameter color des Typs ConsoleColor gibt die Farbe an, in der das Zeichen die Zeile füllen soll und ist nicht erforderlich.

Syntax:

// chr: String
// color: ConsoleColor
ConsoleHelper.LineOfChar(chr, color).Write();

Beispiel:

// write a line of "="
ConsoleHelper.LineOfChar("=", System.ConsoleColor.Yellow).Write();

Ausgabe:

6.2. Zentrieren

Der Parameter text des Typs String gibt den Text an, der zentriert werden soll. Der optionale Parameter fill des Typs String gibt das Zeichen an, mit dem der Freie Platz in dieser Zeile der Konsole gefüllt werden soll. Der ebenfalls optionale Parameter color des Typs ConsoleColor gibt die Farbe an, mit der die Zeile dargestellt werden soll.

Syntax:

// text: String
// fill: String
// color: ConsoleColor
ConsoleHelper.Center(text, fill, color).Write();

Beispiel:

// write "Hello World" centered between a lot of "="
ConsoleHelper.Center("Hello World", "=", System.ConsoleColor.Red).Write();

Ausgabe:

Beispiele

Hier gibt es noch ein paar Beispiele zu oben nicht dokumentierten Sachen.

Nachrichtenverarbeitung

Eigene Verarbeitungsklasse:

public class MyAddition : ILoggingAddition
{
    /// 
    /// 
    /// 
    /// message
    /// color of the message
    public void ProcessMessage(string s, ConsoleColor color)
    {
        DoSomething(s);
    }
}

Eigene Verarbeitungsklasse Benutzen:

// use MyAddition to process the log messages
Logger.UsedLogger = new MyAddition();

Eigene Logstufenkonfiguration

Klasse:

/// 
/// my color configuration
/// 
public class MyConfiguration : LoggingConfiguration
{
    /// 
    /// constructor with default values
    /// 
    public MyConfiguration() : base(ConsoleColor.Green, new PrefixAction((time) =>
    {
        return "[MyName] " + time + " ";
    }),
    new PrefixAction(() =>
    {
        return "[" + FormatInteger(DateTime.Now.Hour) + ":" + FormatInteger(DateTime.Now.Minute)
          + ":" + FormatInteger(DateTime.Now.Second) + "]";
    }))
    {

    }

    private static string FormatInteger(int i)
    {
        if (i.ToString().Length > 1)
            return i.ToString();
        return "0" + i.ToString();
    }
}

Eigener Logger

Klasse:

/// 
/// my logger
/// 
public class MyLogger : ILogger
{
    /// 
    /// configuration for debug logs
    /// 
    public LoggingConfiguration DebugConfiguration { get; set; } = new MyConfiguration();
    /// 
    /// configuration for info logs
    /// 
    public LoggingConfiguration InfoConfiguration { get; set; } = new MyConfiguration();
    /// 
    /// configuration for warn logs
    /// 
    public LoggingConfiguration WarnConfiguration { get; set; } = new MyConfiguration();
    /// 
    /// configuration for error logs
    /// 
    public LoggingConfiguration ErrorConfiguration { get; set; } = new MyConfiguration();

    /// 
    /// additional logging operation
    /// 
    public ILoggingAddition Addition { get; set; } = new NoAddition();

    private void LogForConfiguration(LoggingConfiguration c, string s)
    {
        var m = c.GetPrefix(c.GetTimePrefix()) + s;
        MyWrite(m, c.Color);
        Addition.ProcessMessage(m, c.Color);
    }

    /// 
    /// logs a string as debug
    /// 
    /// string to log
    public void Debug(string s)
    {
        LogForConfiguration(DebugConfiguration, s);
    }

    /// 
    /// logs a string as error
    /// 
    /// string to log
    public void Error(string s)
    {
        LogForConfiguration(ErrorConfiguration, s);
    }


    /// 
    /// gets addition
    /// 
    /// addition
    public ILoggingAddition GetAddition()
    {
        return Addition;
    }

    /// 
    /// gets debug configuration
    /// 
    /// debug configuration
    public LoggingConfiguration GetDebugConfiguration()
    {
        return DebugConfiguration;
    }

    /// 
    /// gets error configuration
    /// 
    /// error configuration
    public LoggingConfiguration GetErrorConfiguration()
    {
        return ErrorConfiguration;
    }

    /// 
    /// gets info configuration
    /// 
    /// info configuration
    public LoggingConfiguration GetInfoConfiguration()
    {
        return InfoConfiguration;
    }

    /// 
    /// gets warn configuration
    /// 
    /// warn configuration
    public LoggingConfiguration GetWarnConfiguration()
    {
        return WarnConfiguration;
    }

    /// 
    /// logs a string as info
    /// 
    /// string to log
    public void Info(string s)
    {
        LogForConfiguration(InfoConfiguration, s);
    }


    /// 
    /// sets addition
    /// 
    /// new value
    public void SetAddition(ILoggingAddition addition)
    {
        Addition = addition;
    }

    /// 
    /// sets new debug configuration
    /// 
    /// new value
    public void SetDebugConfiguration(LoggingConfiguration configuration)
    {
        DebugConfiguration = configuration;
    }

    /// 
    /// sets new error configuration
    /// 
    /// new value
    public void SetErrorConfiguration(LoggingConfiguration configuration)
    {
        ErrorConfiguration = configuration;
    }

    /// 
    /// sets new info configuration
    /// 
    /// new value
    public void SetInfoConfiguration(LoggingConfiguration configuration)
    {
        InfoConfiguration = configuration;
    }

    /// 
    /// sets new warn configuration
    /// 
    /// new value
    public void SetWarnConfiguration(LoggingConfiguration configuration)
    {
        WarnConfiguration = configuration;
    }

    /// 
    /// logs a string as warn
    /// 
    /// string to log
    public void Warn(string s)
    {
        LogForConfiguration(WarnConfiguration, s);
    }
}

Verwenden:

// use MyLogger for Logging
Logger.UsedLogger = new MyLogger();

Von Daniel Balk

Ich entwickle in meiner Freizeit größtenteils Software, unter anderem auch diese Seite, für mich selbst oder auch für Endelon Hosting, einem Hoster, der es sich zum Ziel gesetzt hat, seine Kunden mit kostenlosen Gameservern bei ihren Projekten zu unterstützen, bei dem ich mich auch aktiv im Kundensupport beteilige.


Kommentare