怎么读取会发生轮转(rotate)的文件内容

如何读取会发生轮转(rotate)的文件内容?用ifstream能够读取文本文件的内容是大家都知道的,而且其中的sync(

如何读取会发生轮转(rotate)的文件内容?
用ifstream能够读取文本文件的内容是大家都知道的,而且其中的sync()方法能够使得读入文件流和输入源同步,实现对文件内容的实时跟踪。但是很多日志文件(log   file)是有一定的轮转机制的(rotate),一般有几种方式:

1.当文件的size达到某个值之后,创建一个新文件,将当前内容全部拷贝到新文件中,关闭新文件,清空当前文件,重新开始写入。

2.当文件的size达到某个值之后,直接关闭当前文件,重命名,并产生另一个log   file,重新开始写入。

3.当文件的size达到某个值之后,创建一个新文件,将当前内容全部拷贝到新文件中,关闭新文件,删除当前文件,重新创建一个同名文件,并重新开始写入。

其中1方式下的处理比较简单,sync()能够保证和输入的同步;但2、3方式下就遇到了麻烦:因为ifstream对象会锁住文件,从而不能进行重命名和删除的操作。如果这时ifstream对象能够得知rotate的发生,则可以调用close()方法将文件解锁。问题就是如何得知rotate的时机?(我不能修改产生log文件的程序,只能在读取端想办法了。)

我尝试了自己估算文件size的方式。但由于log文件的写入是随机追加的,因此无法预测文件的size,而且这样做还会丢失一些数据,不是理想的解决方案。

[解决办法]
最好能知道系统中管理日志文件的服务配置,看那个服务什么时候rotate日志
如果不知道的话,按你上文说的也可以不用创建文件流来获得文件大小,比如一些系统命令,
这样读文件前可以大致判断你的操作是否会影响rotate服务。
总之不管用什么方法,你总是在未经rotate服务允许下来访问它的资源,少不了要有麻烦。
如果能让rotate服务向外提供一个接口与你通信是最好不过的了,不知道现实系统里有没有那个功能,你可以参考一下logrotate的源码,再或者自己扩展logrotate的功能
[解决办法]
up
[解决办法]
要感知文件改动,你最好让那个程序自己告诉你。
如果不行,那么只好上hook技术,不过不推荐,hook实在被太烂用了。
[解决办法]
最好和 生成该轮转(rotate)文件 的进程进行交互...
[解决办法]
mark