2008-12-06 6 views
2

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 decorator pattern, car il y a de nombreuses façons pour les gens de regarder ces journaux. J'ai un logger d'email, un enregistreur de dossier, et un enregistreur d'événement de fenêtres, tous qui héritent de LoggingDecorator, qui implémente ILogger. Donc, aucun enregistreur ne connaît un autre enregistreur.C# windows-services - Comment gérer les exceptions de journalisation?

Ma question est: Comment gérer les exceptions de journalisation?

Si l'écriture dans un fichier échoue ou si l'envoi d'un e-mail échoue, que dois-je faire? Je veux enregistrer le contenu du journal initial avec les autres journaux, mais que faire avec l'exception de journalisation? Cela ne dépend pas aussi de l'ordre des loggers dans le constructeur?

Pour le moment, je ne fais qu'encapsuler des blocs try/catch avec des instructions catch (Exception) vides, ce qui me semble juste sale et me fait hurler FxCop. Cependant, est-ce un de ces moments "it depends"?

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

Répondre

1

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

6

Pourquoi ne mettez pas dans Windows événement réel log en cas d'échec enregistreur?

+1

Calme toi! Nous ne tolérerons pas le bon sens ici! +1 –

0

Créez un service de ping séparé sur une machine qui se comporte bien que vous avez confiance pour être très fiable. Si votre service principal échoue, la commande ping échoue également et le service de contrôle doit vous envoyer un courrier électronique avec avertissement.

Questions connexes