2

Windows サービスを作成しています。例外が発生した場合は、適切に処理してログを作成します。人々がこれらのログを見るさまざまな方法があるため、私はデコレータ パターンを使用しています。ILogger を実装する LoggingDecorator から継承する電子メール ロガー、ファイル ロガー、および Windows イベント ロガーがあります。したがって、ロガーは他のロガーについて知りません。

私の質問は次のとおりです。ログの例外をどのように処理すればよいですか?

ファイルへの書き込みに失敗した場合、または電子メールの送信に失敗した場合、どうすればよいですか? 初期のログ コンテンツを他のロガーでログに記録したいのですが、ログの例外はどうすればよいですか? コンストラクター内のロガーの順序にも依存しませんか?

今のところ、try/catch ブロックを空の catch(Exception) ステートメントでラップしているだけです。しかし、これは「場合による」瞬間の 1 つですか?

[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;
4

3 に答える 3

6

ロガーが失敗した場合、実際の Windows イベント ログに記録しないのはなぜですか?

于 2008-12-06T01:02:55.897 に答える
1

それは答えではありませんが、なぜ既存の System.Diagnostics.Trace メソッドを利用しないことを選択したのか不思議です。おそらくその上に、ログタイプのある種の分類を実装できますか?

于 2008-12-06T01:52:50.507 に答える
0

非常に信頼できると信頼している、正常に動作するマシンで別の ping サービスを作成します。プライマリ サービスに障害が発生した場合、ping も失敗し、制御サービスから警告の電子メールが送信されます。

于 2008-12-06T01:36:45.720 に答える