我正在尝试创建一个工具来获取一个格式化的文本文件,该文件存储我们的日志记录信息并仅返回它的某些部分。例如,日志文件如下所示:
[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
我想从文件中获取此文本,并根据尖括号中每个日志消息类型的复选框,用户可以隐藏他们不关心的内容。例如取消选中“Step”复选框会隐藏Step行,但是如果他们要重新检查它,它会重新出现在文本窗口中。
我尝试将每一行存储到一个字符串中,该字符串存储在列表中以保持每一行的顺序,但是这种方法在更改文本时非常慢。方法如下所示
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是一个字符串列表,其中包含在加载时设置的允许内容,并在对应于日志类型的复选框的检查事件上更改。上面的第一种方法用于加载和每个检查事件以更新显示的内容。
答案 0 :(得分:0)
我认为实现这一目标的最佳方法是使用listview控件。您可以在文本文件中每行添加一个项目,然后根据复选框过滤显示的项目(行)。我可以推荐ObjectListView作为实现这一目标并让它看起来漂亮的方法。
答案 1 :(得分: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);
}
}