문제

Windows 서비스를 만들고 있습니다. 예외가 발생하면 적절하게 처리하고 로그를 만듭니다. 나는 그것을 사용하고있다 데코레이터 패턴, 사람들 이이 통나무를보고있는 여러 가지 방법이 있기 때문에 여러 가지가 있습니다. 이메일 로거, 파일 로거 및 Windows 이벤트 로거가 있습니다. 따라서 로거는 다른 로거에 대해 알지 못합니다.

내 질문은 : 로깅 예외를 어떻게 처리해야합니까?

파일에 쓰기가 실패하거나 이메일을 보내는 경우 어떻게해야합니까? 초기 로그 내용을 다른 로거로 기록하고 싶지만 로깅 예외로 무엇을해야합니까? 생성자의 로거 순서에도 의존하지 않습니까?

지금, 나는 빈 캐치 (예외) 문으로 시도/캐치 블록을 포장합니다. 그러나 이것이 그 중 하나입니다 "때에 따라 다르지" 순간?

[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;
도움이 되었습니까?

해결책

답은 아니지만 기존 시스템을 사용하지 않기로 선택한 이유는 궁금합니다. 아마도 로그 유형의 일부 유형의 분류를 구현할 수 있습니까?

다른 팁

로거가 실패하면 실제 Windows 이벤트 로그에 넣지 않는 이유는 무엇입니까?

매우 신뢰할 수 있다고 신뢰하는 잘 작동하는 기계에서 별도의 핑 서비스를 만듭니다. 기본 서비스가 실패하면 Ping도 실패하고 제어 서비스를 제공하면 경고와 함께 이메일을 보내야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top