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;
Calme toi! Nous ne tolérerons pas le bon sens ici! +1 –