0

ログ情報を保存し、その特定の部分のみを返す、書式設定されたテキスト ファイルを取得するツールを作成しようとしています。たとえば、ログ ファイルは次のようになります。

[TimeStamp] <Config>: Configuration note is shown here
[TimeStamp] <Info>: Information is written here   
[TimeStamp] <Info>: More Information
[TimeStamp] <Step>: A generated step is writing a message
[TimeStamp] <Warning>: A warning is logged
[TimeStamp] <Error>: An error has occurred

ファイルからこのテキストを取得したいと思います。山括弧内の各ログ メッセージ タイプのチェックボックスに基づいて、ユーザーは見たくないものを非表示にできます。「ステップ」チェックボックスをオフにすると、ステップ行が非表示になりますが、再度チェックすると、テキスト ウィンドウに再び表示されます。

各行を順番に保持するためにリストに格納される文字列に各行を格納しようとしましたが、この方法ではテキストの変更が非常に遅くなります。その方法を以下に示します

logTextbox.Text = "";
foreach (string line in CompleteLog) //CompleteLog is list containing each line in log file
{
   if (CheckLine(line)) //Checks line based on what the user wants to see
   {
      WriteLine(line);
   }
}

どんな提案でも大歓迎です

編集:

        private bool CheckLine(string line)
    {
        int left = line.IndexOf('<');
        int right = line.IndexOf(">:");

        string logtype = line.Substring(left+1, right - left-1);
        if (ValidLogs.Any(p => p.ToLower().Equals(logtype.ToLower())))
        {
            return true;
        }

        return false;
    }

ValidLogs は、ロード時に設定され、ログ タイプに対応するチェックボックスのチェック イベントで変更される許可を含む文字列のリストです。上記の最初の方法は、表示内容を更新するためにロード時と各チェック イベントで使用されます。

4

2 に答える 2

0

メモリの制限や過度に大きなファイルがなく、フィルター基準が固定されていると仮定すると、フィルター基準の各行を事前に解析し、フィルターの詳細をログ オブジェクトに保存してから、単純なプロパティを持つオブジェクトをチェックすることができます。毎回再解析する必要があります。

public class LogLine {
       public string Text { get; set; }
       public eLogLevel LogLevel { get; set; }
       // other filter properties
}

次に、CheckLines() を変更して LogLine オブジェクトのリストをフィルタリングします。

logTextbox.Text = "";
foreach (LogLine line in ParsedLog) //ParsedLog is list containing each line in log file pre-parsed
{
   if (CheckLine(line)) //Checks line based on what the user wants to see
   {
      WriteLine(line.Text);
   }
}
于 2013-02-22T01:03:22.867 に答える
0

これを実現する最善の方法は、リストビュー コントロールを使用することだと思います。テキスト ファイルに 1 行ごとに項目を追加し、チェックボックスに応じて表示される項目 (行) をフィルター処理することができます。これを実現し、美しく見せる方法として、 ObjectListViewをお勧めします。

于 2013-02-22T00:27:21.553 に答える