Frage

Ich schaffe einen Windows-Dienst. Wenn eine Ausnahme occurrs ich es entsprechend behandeln und ein Protokoll erstellen. Ich bin mit dem Dekorateur Muster , da gibt es viele verschiedene Möglichkeiten, die Menschen in diesen Protokollen suchen werden . Ich habe eine E-Mail-Logger, eine Datei Logger und ein Windows-Ereignisprotokoll, alle, die sich von LoggingDecorator erben, die ILogger implementiert. Also kein Logger kennt keinen anderen Logger.

Meine Frage ist: Wie soll ich die Protokollierung Ausnahmen zu behandeln?

Wenn Schreiben in eine Datei fehlschlägt, oder eine E-Mail fehlschlägt, was soll ich tun? Ich mag den anfänglichen Protokollinhalt mit den anderen Loggern protokollieren, aber was ich mit der Protokollierung Ausnahme machen? Ist es nicht auch in der Größenordnung des Logger im Konstruktor abhängen?

Gerade jetzt, ich bin Verpackung nur try / catch-Blöcke mit leeren catch (Exception) Aussagen, die nur schmutzig anfühlt und machen FxCop schreit mich an. Dies ist jedoch eine jener „es kommt“ Momente?

[Flags]
public enum LoggingCategories
{
    None = 0,
    ServiceEvents = 1, 
    ProcessingInformation = 2,
    ProcessingErrors = 4,
    UnexpectedErrors = 8
}

public interface ILogger
{
    void LogMessage(LoggingCategories category, string message);
}

public abstract class LoggerDecorator : ILogger
{
    private ILogger _decoratedLogger;
    private LoggingCategories _categories;

    protected LoggerDecorator(ILogger logger, LoggingCategories categories)
    {
        this._decoratedLogger = logger;
        this._categories = categories;
    }

    protected bool ShouldLogCategory(LoggingCategories category)
    {
        return ((this._categories & category) == category);
    }

    public virtual void LogMessage(LoggingCategories category, string message)
    {
        _decoratedLogger.LogMessage(category, message);
    }

}

public class ControlLogger : ILogger
{
    public ControlLogger()
    {
    }

    public void LogMessage(LoggingCategories category, string message)
    {
        Console.WriteLine(LoggingHelper.ConstructLog(category, message));
    }
}

(fragwürdiger Code in WindowsEventLogger)

try
{
    this._eventLog.WriteEntry(log, type);
}
catch (Exception)
{
    //Even if this logging fails, we do not want to halt any further logging/processing.
}

(Code in Service-Konstruktor)

ILogger controlLogger = new ControlLogger();
ILogger windowsEventLogger = new WindowsEventLogger(controlLogger, windowsEventLogCategories, windowsEventLogSource);
ILogger emailLogger = new EmailLogger(windowsEventLogger, emailCategories, emailSubject, emailAddresses);
ILogger fileLogger = new FileLogger(emailLogger, fileCategories, logDirectory, logFileNamePrefix, logFileExtension);

this._logger = fileLogger;
War es hilfreich?

Lösung

Es ist nicht eine Antwort, aber neugierig, warum Sie die vorhandenen System.Diagnostics.Trace Methoden nicht wählen zu nutzen. Sie könnten eine Art von Kategorisierung von Protokolltypen implementieren obenauf es vielleicht das?

Andere Tipps

Warum setzt sie nicht in dem aktuellen Windows-Ereignisprotokoll, wenn Logger ausfällt?

Erstellen Sie separaten Ping-Dienst auf eine gut verhaltene Maschine, die Sie sehr zuverlässig sein vertrauen. Wenn Ihr primärer Dienst dann auch nicht ping fehlschlägt und Kontrolldienst, dann sollten Sie E-Mail mit Warnung senden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top