Question

Je crée un service Windows. Lorsqu'une exception se produit, je la gère de manière appropriée et crée un journal. J'utilise le modèle de décorateur , car il existe différentes manières de consulter ces journaux. . J'ai un enregistreur de courrier électronique, un enregistreur de fichiers et un enregistreur d'événements Windows, qui héritent tous de LoggingDecorator, qui implémente ILogger. Donc, aucun enregistreur ne connaît d’autres enregistreurs.

Ma question est la suivante: comment gérer les exceptions de journalisation?

En cas d'échec de l'écriture dans un fichier ou de l'envoi d'un courrier électronique, que dois-je faire? Je souhaite consigner le contenu du journal initial avec les autres consignateurs, mais que dois-je faire avec l'exception de consignation? Cela ne dépend-il pas également de l'ordre des enregistreurs dans le constructeur?

Pour le moment, je suis en train de boucler des blocs try / catch avec des instructions catch vides (Exception), qui se sentent sales et font hurler FxCop. Cependant, s'agit-il de ces "cela dépend" moments?

[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));
    }
}

(code douteux dans 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 dans le constructeur de service)

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;
Était-ce utile?

La solution

Ce n'est pas une réponse, mais curieux de savoir pourquoi avez-vous choisi de ne pas utiliser les méthodes System.Diagnostics.Trace existantes. Vous pourriez mettre en œuvre un type de catégorisation des types de journaux en plus, peut-être?

Autres conseils

Pourquoi ne pas le mettre dans le journal des événements Windows si le consignateur échoue?

Créez un service de ping séparé sur une machine très performante en laquelle vous avez confiance d'être très fiable. Si votre service principal échoue, la commande ping échoue également et le service de contrôle doit alors vous envoyer un courrier électronique avec avertissement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top