【问题标题】:Read log file from last read position从上次读取位置读取日志文件
【发布时间】:2015-12-18 20:30:38
【问题描述】:

这是我的工作代码,我有一个文件监视器监视我的日志文件,当文件更新(它更新很多)时,它会读取日志并将符合正则表达式的行输出到文本框。它的问题是它从头开始读取文件并再次重新打印正则表达式行,所以我在文本框中得到重复的数据。我也不知道我是否设置正确以运行从单独线程读取的文件,因此我的程序在读取大型日志文件时不会“冻结”。

private void btnStart_Click(object sender, EventArgs e)
{
    if ((Properties.Settings.Default.setting_logfile != "") && (Properties.Settings.Default.setting_logfolder != ""))
    {
        if (btnStart.Text == "Start Parsing")
        {
            // change text on button and switch status image
            btnStart.Text = "Stop Parsing";
            pbStatus.Image = Properties.Resources.online;

            new Thread(() => Run()).Start();
        }
        else
        {
            btnStart.Text = "Start Parsing";
            pbStatus.Image = Properties.Resources.offline;
            fsWatcher.EnableRaisingEvents = false;
        }
    }
    else
    {
        tbOutput.Text = "Please select a log file to parse.";
    }
}

private void Run()
{
    try
    {
        fsWatcher.Changed += new FileSystemEventHandler(OnChanged);
        fsWatcher.EnableRaisingEvents = true;
    }
    catch (Exception ex)
    {
        MessageBox.Show("An error occurred: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

private void OnChanged(object source, FileSystemEventArgs e)
{
    string line;

    Regex pattern = new Regex(@"\[[\w :]+\]\s<SYSTEMWIDE_MESSAGE>:");

    Stream stream = File.Open(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
    StreamReader streamReader = new StreamReader(stream);

    while ((line = streamReader.ReadLine()) != null)
    {
        Match match = pattern.Match(line);
        if (match.Success)
        {
            tbOutput.AppendText(line + "\r\n");
        }
    }
    streamReader.Close();
    stream.Close();
}

【问题讨论】:

  • 此代码不起作用,因为您正在访问 tbOutput(我假设它是来自非 UI 线程的 TextBox
  • 上面的代码有效,我已经运行了

标签: c# regex wpf logfile-analysis


【解决方案1】:

您可以记住上次阅读的位置并从那里开始。

 Regex pattern = new Regex(@"\[[\w :]+\]\s<SYSTEMWIDE_MESSAGE>:");
 long lastPosition = 0;

 private void OnChanged(object source, FileSystemEventArgs e)
 {
   string line;


   Stream stream = File.Open(e.FullPath, FileMode.Open, FileAccess.Read,     FileShare.ReadWrite);
   stream.Seek(lastPosition, SeekOrigin.Begin);
   StreamReader streamReader = new StreamReader(stream);

   while ((line = streamReader.ReadLine()) != null)
   {
      if (pattern.Match(line).Success)
      {
        tbOutput.AppendText(line + Environment.NewLine);
      }
   }
   lastPosition = stream.Position;  // may need to subtract 1!!!
   streamReader.Close();
   stream.Close();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 2015-08-28
    • 2019-07-26
    相关资源
    最近更新 更多