在C#中使用'keyword'的最后一行打印后获取所有行

时间:2015-02-06 14:27:41

标签: c# stringbuilder streamreader streamwriter

我正在开发一个c#项目。 我试图在应用程序崩溃时通过电子邮件发送日志文件。 但是logfile的大小稍微大一些。

所以我认为我应该只包含日志文件的特定部分。

为此,我试图读取具有指定关键字的最后一行实例之后的所有行。(在我的情况下"应用程序已启动")

因为应用程序多次重启(由于崩溃),“应用程序启动”#39;在文件中多次打印。所以我只想要包含' Application Started' &安培;之后的行直到文件结束。

我需要帮助才能弄明白我该怎么做。

我刚刚开始使用基本代码。

System.IO.StreamReader file = new System.IO.StreamReader("c:\\mylogfile.txt");
while((line = file.ReadLine()) != null)
{
    if ( line.Contains("keyword") )
    {

    }

}

3 个答案:

答案 0 :(得分:0)

逐行阅读文件,直到找到关键字为止。找到关键字后,请先将每行推到List<string>。如果您在关键字中找到另一行,只需Clear您的列表,然后从该点开始重新填写。

类似的东西:

List<string> buffer = new List<string>();
using (var sin = new StreamReader("pathtomylogfile")) 
{
    string line;
    bool read;
    while ((line = sin.ReadLine())!=null) 
    {
        if (line.Contains("keyword"))
        {
            buffer.Clear();
            read = true;
        }
        if (read)
        {
            buffer.Add(line);
        }
    }
    // now buffer has the last entry
    // you could use string.Join to put it back together in a single string
    var lastEntry = string.Join("\n",buffer);
}

如果每个条目中的行数非常大,则首先扫描文件以查找最后一个条目然后再次循环以提取它可能更有效。如果整个日志文件不是那么大,那么仅ReadToEnd可能更有效率,然后使用LastIndexOf来查找最后一个条目的开头。

答案 1 :(得分:0)

从文件中读取所有内容,然后选择所需的部分。

   string lines = System.IO.File.ReadAllText("c:\\mylogfile.txt");
   int start_index = lines.LastIndexOf("Application Started");
   string needed_portion = lines.Substring(start_index);
   SendEmail(needed_portion);

答案 2 :(得分:0)

我建议您使用正确的记录器,例如 log4net NLogger 。 您可以将其配置为保存到多个文件 - 一个包含完整日志,另一个包含错误/例外。您还可以设置日志文件的最大大小等。或者可以将它们配置为在发生异常时向您发送邮件。

当然,这并不能解决您当前的问题,因为上面有一些解决方案。

但我会尝试更简单的方法,例如尝试 Notepad ++ - 它可以处理更大的文件(上次我用它格式化了 30MB XML文档,它花了大约20分钟,但他做到了!用简单的文本文件应该有更好的性能。)。或者,如果您打开文件仅供阅读(而不是编辑),您可以获得更好的性能(在Windows中)。