Pergunta

Estou criando um serviço do Windows. Quando um occurrs de exceção, eu lidar com isso de forma adequada e criar um log. Eu estou usando o decorador padrão , pois há muitas maneiras diferentes as pessoas vão estar a olhar para esses logs . Eu tenho um logger e-mail, um registrador de arquivo e um registrador de eventos do Windows, todos os que herdam LoggingDecorator, que implementa ILogger. Então, não logger sabe sobre qualquer outro registrador.

A minha pergunta é: Como devo lidar com registrando exceções?

Se a escrita para um arquivo falhar, ou enviar um e-mail falhar, o que devo fazer? Quero registrar o conteúdo do registo inicial com os outros madeireiros, mas o que eu faço com a exceção de registro? Não é também dependem da ordem dos madeireiros no construtor?

Agora, eu só estou enrolando try / catch blocos com declarações vazio catch (Exception), que só se sente sujo e faz FxCop gritar comigo. No entanto, isso é um daqueles "depende" momentos?

[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));
    }
}

(código questionável em WindowsEventLogger)

try
{
    this._eventLog.WriteEntry(log, type);
}
catch (Exception)
{
    //Even if this logging fails, we do not want to halt any further logging/processing.
}

(código no construtor de serviço)

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;
Foi útil?

Solução

A sua não é uma resposta, mas curioso por que você escolheu não utilizar os métodos System.Diagnostics.Trace existentes. Você poderia implementar algum tipo de categorização de tipos de log no topo que ele talvez?

Outras dicas

Por que não colocá-lo no log de eventos do Windows real se logger falhar?

Criar serviço de ping separado sobre uma máquina bem comportando que você confia para ser muito confiável. Se o seu serviço primário falhar depois de ping também falhar e serviço de controle, em seguida, você deve enviar um e-mail com aviso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top