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

StackOverflow https://stackoverflow.com/questions/345656

Вопрос

Я создаю службу Windows. Когда возникает исключение, я обрабатываю его соответствующим образом и создаю журнал. Я использую шаблон декоратора , так как люди будут смотреть на эти журналы по-разному. , У меня есть регистратор электронной почты, регистратор файлов и регистратор событий Windows, все они наследуются от LoggingDecorator, который реализует ILogger. Таким образом, ни один регистратор не знает ни о каком другом регистраторе.

Мой вопрос: как мне обрабатывать исключения из журналов?

Если запись в файл не удалась или отправка письма не удалась, что мне делать? Я хочу записать исходное содержимое журнала с другими регистраторами, но что мне делать с исключением регистрации? Разве это также не зависит от порядка регистраторов в конструкторе?

Прямо сейчас я просто обертываю блоки try / catch пустыми операторами catch (Exception), которые просто кажутся грязными и заставляют FxCop кричать на меня. Однако это & Quot; это зависит " моментов?

[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;
Это было полезно?

Решение

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top