Pregunta

Estoy creando un servicio de Windows. Cuando ocurre una excepción, lo manejo adecuadamente y creo un registro. Estoy usando el patrón de decorador , ya que hay muchas maneras diferentes en que las personas verán estos registros . Tengo un registrador de correo electrónico, un registrador de archivos y un registrador de eventos de Windows, todos los cuales heredan de LoggingDecorator, que implementa ILogger. Por lo tanto, ningún registrador sabe de ningún otro registrador.

Mi pregunta es: ¿Cómo debo manejar las excepciones de registro?

Si falla la escritura en un archivo o falla el envío de un correo electrónico, ¿qué debo hacer? Quiero registrar el contenido del registro inicial con los otros registradores, pero ¿qué hago con la excepción de registro? ¿No depende también del orden de los registradores en el constructor?

En este momento, solo estoy envolviendo bloques try / catch con sentencias catch (Exception) vacías, lo que se siente sucio y hace que FxCop me grite. Sin embargo, este es uno de esos " 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 cuestionable en 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 en el constructor del servicio)

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

Solución

No es una respuesta, pero es curioso por qué elegiste no utilizar los métodos existentes de System.Diagnostics.Trace. ¿Podría implementar algún tipo de categorización de tipos de registro encima, tal vez?

Otros consejos

¿Por qué no ponerlo en el registro real de eventos de Windows si falla el registrador?

Cree un servicio de ping por separado en una máquina que se comporte bien y que confíe en que sea muy confiable. Si su servicio principal falla, el ping también falla y el servicio de control debe enviarle un correo electrónico con advertencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top