Я создаю службу Windows. Когда возникает исключение, я обрабатываю его соответствующим образом и создаю журнал. Я использую шаблон декоратора , так как есть много разных способов, которыми люди будут смотреть на эти журналы. У меня есть регистратор электронной почты, регистратор файлов и регистратор событий Windows, все они наследуются от LoggingDecorator, который реализует ILogger. Таким образом, ни один регистратор не знает ни о каком другом регистраторе.
У меня такой вопрос: как мне обрабатывать исключения из журналов?
Если запись в файл не удалась или отправка письма не удалась, что мне делать? Я хочу записать исходное содержимое журнала с другими регистраторами, но что мне делать с исключением регистрации? Разве это также не зависит от порядка регистраторов в конструкторе?
Прямо сейчас я просто оборачиваю блоки try / catch пустыми операторами catch (Exception), которые просто кажутся грязными и заставляют FxCop кричать на меня. Однако, это один из тех "это зависит" моментов?
[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));
}
}
(сомнительный код в WindowsEventLogger)
try
{
this._eventLog.WriteEntry(log, type);
}
catch (Exception)
{
//Even if this logging fails, we do not want to halt any further logging/processing.
}
(код в сервисном конструкторе)
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;