perl – 为什么会输入丢失事件?

perl – 为什么会输入丢失事件?,第1张

概述我需要使用Perl和 Linux::Inotify2处理大型(~100s)的系统日志消息. 我写了一个连续生成日志消息的测试脚本.要处理事件,我的Perl脚本看起来像这样 – #!/usr/bin/perluse Linux::Inotify2 ;use Time::HiRes qw(usleep nanosleep);# create a new object my $inotify = 我需要使用Perl和 Linux::Inotify2处理大型(~100s)的系统日志消息.

我写了一个连续生成日志消息的测试脚本.要处理事件,我的Perl脚本看起来像这样 –

#!/usr/bin/perluse linux::Inotify2 ;use Time::HiRes qw(usleep nanosleep);# create a new object my $inotify = new linux::Inotify2    or dIE "Unable to create new inotify object: $!" ; # create watch $inotify->watch ("/var/log/messages",IN_ACCESS|IN_OPEN|IN_CLOSE|IN_MODIFY|IN_Q_OVERFLOW)    or dIE "watch creation Failed" ;my $count=0; while () {   my @events = $inotify->read;   unless (@events > 0) {     print "read error: $!";     last ;   }   #printf "mask\t%d\n",$_->mask foreach @events ;    $count++;   print $count."\n";   usleep(100000); }

如果我取消注释usleep函数来模拟处理,我注意到当我停止日志生成器脚本时,inotify脚本没有赶上它.换句话说,inotify Perl脚本正在丢失事件.

我也没有看到任何溢出消息.

如何确保即使我的处理速度很慢,我也不会丢失消息.换句话说,如何定义可暂时存储消息的“缓冲区”?

解决方法 我将尝试解决您的根本问题,即使它没有完全回答您的问题.

我认为使用inotify太低级了解决这个问题.如果我是你,我会看一个更高级别的解决方案,让你从发现新事件的细节中解放出来,让你专注于处理日志事件.当有一堆好的已经可用时,无需重新发明轮子.

我的第一选择是使用现代的syslog守护进程(我个人更喜欢Syslog-NG,但rsyslog也可以运行得很好),并将其直接与你的脚本联系起来.当新事件进入时,您的脚本只会处理stdin,并且syslog守护程序会在脚本进入时自动将新日志发送到您的脚本中,而不是您的脚本完成所有跟踪工作.我已经在很多场合成功使用过这种方法.

我的第二选择是让更高级别的Perl模块尽可能多地完成繁重的工作.我要找的第一个地方就是file :: Tail.像以前一样,这使您免于观察文件本身的问题,并让您专注于处理.

总结

以上是内存溢出为你收集整理的perl – 为什么会输入丢失事件?全部内容,希望文章能够帮你解决perl – 为什么会输入丢失事件?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1232969.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存