我正在尝试创建一个简单的文件监视器,它会在日志文件中定期检查更新并处理更新。我尝试使用 FileSystemWatcher ,但这需要我的应用程序才能永远运行。我正在考虑更多关于读取更改,退出,等待计时器,再次读取更改的行。
我创建了一个定期运行的服务来读取文件并获取整个数据。下面是简单的代码。
private void SchedularCallback(object e)
{
string logFile = ReadFromFile("C:\\test.log");
this.WriteToFile(logFile);
this.ScheduleService();
}
WriteToFile
函数将数据写入单独的文件(进程数据,实际进程可能涉及其他任务,如调用WCF服务,检查Internet访问等)。每次回调发生时,ReadFromFile都会读取日志文件。下面是读取文件的代码。
private string ReadFromFile(string path)
{
try
{
string logs = "";
using (StreamReader reader = new StreamReader(path, true))
{
logs = reader.ReadToEnd();
reader.Close();
}
return logs;
}
catch (Exception ex)
{
WriteToFile("Simple Service Error on: {0} " + ex.Message + ex.StackTrace);
//Stop the Windows Service.
using (System.ServiceProcess.ServiceController serviceController = new System.ServiceProcess.ServiceController("SimpleService"))
{
serviceController.Stop();
}
return "";
}
}
正如您所注意到的,每次回调发生时,此代码都会读取整个文件。由于日志文件最终可能很大,因此无法每次读取和处理整个文件。为了改善这一点,我想到了使用FileSystemWatcher,但这将使我的服务永远运行,只是真正的性能消耗。相反,如果我只能读取文件中的更改,它会更快。
我还想过存储编写器的最后一个偏移量,但只有在追加数据时才会起作用。如果有人删除整个日志或更改一行或两行,则最后一次偏移不会起作用。
在这种情况下,最好的方法是什么。日志文件显然不会经常变化,所以我不需要保持我的服务运行。我不确定二进制流然后与上一个二进制流的比较是一个好主意。任何关于可能的方法的建议都表示赞赏。基本上类似于git用于识别自上次提交以来的更改,这就是我正在寻找的内容。
感谢。
答案 0 :(得分:1)
答案 1 :(得分:0)
这正是FileSystemWatcher的好处。只要它是单个文件,资源使用量就会很小。
更新:实际上,轮询与侦听API /内核的更改可能对日志之类的内容有点过分。搜索日志/日志可能会更好(假设它们已打开)。但在最坏/最可靠的情况下,您可以使用自己的计时器系统来监视文件上的Size + LastModifiedTime。使用MD5校验和也应该可以/快速。
然后,如果有更改,您可以使用差异库进行同步。例如diffplex
如果您可以测试并稍后在此处对结果进行基准测试。这对我和其他用户都非常有帮助,因为我之前已经使用FileSystemWatcherEx实际执行了类似的内容。