实现日志观察程序

Implementing a log watcher

提问人:grom 提问时间:8/22/2008 最后编辑:Adam Tyszeckigrom 更新时间:3/31/2016 访问量:934

问:

我想知道如何实现类似于 C/C++ 中的程序,这是一个监视和处理添加到日志文件中的新行的程序?tail -f

C++ C 文件 IO

评论


答:

0赞 Adam Haile 8/22/2008 #1

看这里

你可以调用尾部并将流检索回你的应用,或者因为它是开源的,也许可以尝试将其拉入你自己的代码中。

此外,可以在 C++ iostream 中打开一个文件仅供查看,然后读取到末尾,同时缓冲最后 10-20 行,然后输出。

5赞 jj33 8/22/2008 #2

你可以使用 fseek() 来清除流上的 eof 条件。从本质上讲,读取到文件的末尾,休眠一会儿,fseek()(不改变你的位置)清除 eof,再次读取到文件末尾。清洗,冲洗,重复。man fseek(3) 了解详情。

这是它在 perl 中的样子。Perl 的 seek() 本质上是 fseek(3) 的包装器,所以逻辑是一样的:

wembley 0 /home/jj33/swap >#> cat p
my $f = shift;
open(I, "<$f") || die "Couldn't open $f: $!\n";

while (1) {
  seek(I, 0, 1);
  while (defined(my $l = <I>)) {
    print "Got: $l";
  }
  print "Hit EOF, sleeping\n";
  sleep(10);
}
wembley 0 /home/jj33/swap >#> cat tfile
This is
some
text
in
a file
wembley 0 /home/jj33/swap >#> perl p tfile
Got: This is
Got: some
Got: text
Got: in
Got: a file
Hit EOF, sleeping

然后,在另一个会话中:

wembley 0 /home/jj33/swap > echo "another line of text" >> tfile

回到原来的程序输出:

Hit EOF, sleeping
Got: another line of text
Hit EOF, sleeping
0赞 Mykroft 8/22/2008 #3

我认为您正在寻找的是 c/c++ 中的 select() 调用。我在这里找到了手册页的副本:http://www.opengroup.org/onlinepubs/007908775/xsh/select.html。Select 将文件描述符作为参数,并告知您其中一个描述符何时已更改并可供读取。

0赞 Eric Z Beard 8/22/2008 #4

tail 程序是开源的,所以你可以参考它。我想知道同样的事情,不久前看了一下代码,认为它会很简单,但我对它的复杂程度感到惊讶。有很多陷阱必须考虑在内。