1

エラーをカウントしてログに記録するオブジェクトを作成しました。タイマー経過後にログを書きます。ログ期間ごとに発生するエラーの数がわからないので、List _lastReadErrors を最大 5 つのエラーに設定します。完全な実装では、さらにエラーをログに記録したいと思います。ロギング オブジェクトは、できるだけ少ないメモリを使用する必要があります。リストに 30 個の文字列を入れると、大きな違いが生じるでしょうか?

public static class Monitor
{
    private static object _syncRoot = new object();

    private static DateTime _monitorStart;

    private static Timer _logTimer;

    private static int _readErrorsAbsolute;

    private static List<string> _lastReadErrors;

    public Monitor()
    {
        _monitorStart = DateTime.Now;
        _logTimer = new Timer();

        _readErrorsAbsolute = 0;

        _readErrors = new List<string>();

        _logTimer.Elapsed += writeLog;
        _logTimer.Interval = 3600000;
        _logTimer.AutoReset = true;
        _logTimer.Enabled = true;
    }

    public DateTime MonitorStart
    {
        get { return _monitorStart; }
    }

    public int ReadErrorsAbsolute
    {
        get { return _readErrorsAbsolute; }
    }

    public void ReadError(Exception ex)
    {
        Interlocked.Increment(ref _readErrorsAbsolute);

        lock (_syncRoot)
        {
            if (_lastReadErrors.Count > 4) _lastReadErrors.RemoveAt(0);
            _lastReadErrors.Add(ex.StackTrace);
        }
    }

    private void writeLog(Object sender, ElapsedEventArgs e)
    {
        string logString = buildLogString();

        // write the logstring into a memorystream

        _monitorStart = DateTime.Now;

        _readErrorsAbsolute = 0;

        lock (_syncRoot)
        {    
             _readErrors = new List<string>();
        }
    }

    private string buildLogString()
    {
        StringBuilder sb = new StringBuilder();

        sb.Append("Date: " + _monitorStart.ToString() + " Errors: " + _readErrorsAbsolute.ToString() + Environment.NewLine);

        lock (_syncRoot)
        {
            foreach (string error in _lastReadErrors)
            {
                sb.Append(error + Environment.NewLine);
            }
        }

        return sb.ToString();
    }
}
4

0 に答える 0