c++ - 解析包含多行条目的日志文件

标签 c++ c winapi

我正在努力从第三方应用程序解析一个合理大小的日志文件(最大 50Mb,此时它会回绕),以便检测在指定时间范围内发生的 KEY_STRING。此日志文件中的典型条目可能如下所示

DEBUG 2013-10-11@14:23:49 [PID] - Product.Version.Module
(Param 1=blahblah Param2=blahblah Param3 =blahblah
Method=funtionname)
String that we usually don't care about but may be KEY_STRING  

条目由空行分隔(\r\n 在条目末尾,然后是\r\n 在下一个条目开始之前)

这是针对 Windows 特定实现的,因此不需要可移植,可以是 C/C++/Win32

逐行读取此内容会很耗时,但好处是能够解析时间戳并检查条目是否在给定时间范围内,然后再检查条目中是否存在任何 KEY_STRING。如果我按 block 读取文件,我可能会找到 KEY_STRING,但该 block 没有较早的时间戳,或者 block 边界甚至可能位于 KEY_STRING 的中间。将整个文件读入内存并解析它不是一个选项,因为这将成为其中一部分的应用程序当前占用空间相对较小,因此不能证明将其增加 ~10 倍只是为了解析文件(即使是暂时的) .有没有一种方法可以通过分隔 block (特别是“\r\n\r\n”)读取文件?还是有我没有想到的其他/更好的方法?

如有任何帮助,我们将不胜感激!

最佳答案

一种可能的解决方案是使用内存映射文件。我个人从未将它们用于玩具应用以外的任何用途,但了解其背后的一些理论。

本质上,它们提供了一种访问文件内容的方式,就好像它们是内存一样,我相信其行为方式与虚拟内存类似,因此所需部分将根据需要调入和调出 在某些时候(您应该阅读文档以找出其背后的规则)。

在伪代码中(因为我们都喜欢伪代码),你会按照这些行做一些事情:

HANDLE file = CreateFile(...);
HANDLE file_map = CreateFileMapping(file, 0, PAGE_READONLY, 0, 0, ...);
LPVOID mem = MapViewOfFile(file_map, FILE_MAP_READ, 0, 0, 0);

// at this point you can use mem to access data in the mapped part of the file...
// for your code, you would perform parsing as if you'd read the file into RAM.

// when you're done, unmap and close the file:
UnmapViewOfFile(mem);
CloseHandle(file_map);
CloseHandle(file);

我现在很抱歉没有给出最好的建议,而是 encourage further reading - Windows 提供了很多功能来处理您的内存,大部分内容都值得一读。

关于c++ - 解析包含多行条目的日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19362650/

相关文章:

c++ - 在 C++ 中没有修饰符的 RegisterHotKey

java - Java 可以用来编写 Win32 系统服务吗?

c++ - 屏幕/玻璃 splinter 效果

C++ 对图形的像素级控制

C - ptrace 和 waitpid 的段错误

c - C语言读/写文件

c++ - 抛出运行时错误

c++ - 当我实现功能时 Sprite 变成白框

正确的 kill syscall linux 使用模式

c++ - IUnknown.Release 标准实现竞争条件?