エラーをカウントしてログに記録するオブジェクトを作成しました。タイマー経過後にログを書きます。ログ期間ごとに発生するエラーの数がわからないので、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();
}
}