c # windows-services - Как мне обрабатывать исключения журналирования? - PullRequest
2 голосов
/ 06 декабря 2008

Я создаю службу 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;

Ответы [ 3 ]

6 голосов
/ 06 декабря 2008

Почему бы не поместить его в фактический журнал событий Windows в случае сбоя регистратора?

1 голос
/ 06 декабря 2008

Это не ответ, но любопытно, почему вы решили не использовать существующие методы System.Diagnostics.Trace. Вы могли бы реализовать некоторый тип категоризации типов журналов поверх этого, возможно?

0 голосов
/ 06 декабря 2008

Создайте отдельную службу ping на машине с хорошим поведением, которая, как вы полагаете, будет очень надежной. Если ваша основная служба дает сбой, то ping также дает сбой и контролирует службу, а затем отправит вам электронное письмо с предупреждением.

...