c # windows-services - как обрабатывать исключения из журнала?

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

person Aaron Daniels    schedule 06.12.2008    source источник


Ответы (3)


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

person chris raethke    schedule 06.12.2008

Почему бы не занести его в реальный журнал событий Windows, если регистратор не работает?

person BobbyShaftoe    schedule 06.12.2008
comment
Успокойся! Мы не потерпим здесь здравого смысла! +1 - person George Stocker; 06.12.2008

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

person Din    schedule 06.12.2008