0

ファイルからタイムスタンプを読み取り、過去 30 分間を振り返って、「CM failed」というキーワードが表示されているかどうかを確認する必要があります。これは、アプリケーションの実行中も常に更新されるログ ファイルです。何か案は?以下に示すコードは過去 30 年間をさかのぼりますが、正確な時刻はわかりません。

TimeSpan ts = TimeSpan.FromMinutes(30);
//fake file which is opened using Notepad++
string temp = @"C:\Temp\efilelog.txt"; 

private void Form1_Load(object sender, EventArgs e)
{
     string str = File.ReadAllText(temp);

     Regex reg = new Regex("CM failed" + DateTime.Now.Subtract(ts));

     Match mat = reg.Match(str);

     // Get the creation time of a well-known directory.
     //DateTime dt = File.GetLastWriteTime(file);
     //Console.WriteLine("The last write time for this file was {0}.", dt, ts);

     if (mat.Success)
     {
         //send email which I already have functional
     }

     this.Close();
    }
}
4

2 に答える 2

0

あなたのコードが何をするのか尋ねているなら。CM FAILED + CM FAILED とそれの間にスペースを入れずに日時オブジェクトの ToString() デフォルト文字列変換の既存のチェックを行っています。

それはあなたの意図ですか?

于 2013-06-24T13:19:14.660 に答える
0

ファイルから最後に失敗した時刻を解析し、その日付が過去 30 分以内であるかどうかを確認する必要があります。次のように失敗した時間を書いているとします。

using (var writer = File.AppendText("efilelog.txt"))            
    writer.WriteLine("CM failed {0}", DateTime.Now.ToString());

次に、最後の失敗時間を取得するには、次のクエリと正規表現が必要です。

Regex regex = new Regex("CM failed(?<time>.+)");
var lastFailTime = File.ReadLines("efilelog.txt")
                       .Select(line => regex.Match(line))
                       .Where(m => m.Success) // take only matched lines
                       .Select(m => DateTime.Parse(m.Groups["time"].Value))
                       .DefaultIfEmpty() // DateTime.Min if no failures
                       .Max();

次に、失敗が 30 分以内かどうかを確認します。

TimeSpan span = TimeSpan.FromMinutes(30);
if (span > DateTime.Now - lastFailTime)
    // alert 

新しい要件に従って、次の正規表現を使用する必要があります。

Regex regex = new Regex("(?<time>.+(AM|PM)).*CM failed");
于 2013-06-24T13:37:56.253 に答える