syslog-ng perl管道丢弃事件

时间:2015-06-04 03:28:26

标签: linux perl syslog syslog-ng

我试图通过syslog-ng将syslogs传递给perl脚本,但并非所有的syslog条目都能通过 - 实际上可能有1/3实际发生。

我已经到处寻找,无法找到远程问题的人。看起来很简单,但我无法找到答案!

这是我的syslog-ng设置:

source s_1 { tcp(port(514)); };

destination d_zen { program("/tmp/zen.pl"); }; 

log { source(s_1); destination(d_zen); }; 

这是我的perl脚本:

#!/usr/bin/perl

use strict;
use warnings;

$|=1

my $filename = "/tmp/zen.log";
open(my $fh, '>>', $filename) or die "could not open file '$filename' $!";

while ( <STDIN> ) {

    print $fh <STDIN>."\n";

};

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您的Perl行缓冲区是否被禁用?

根据syslog-ng manual,它可能会导致一些问题:

“某些外部应用程序会缓冲日志消息,这可能会导致意外延迟和其他问题。例如,如果您将日志消息发送到外部Perl脚本,Perl会使用行缓冲区进行终端输出,否则会阻塞缓冲区。可能想在外部应用程序中禁用缓冲。“

另外,我不知道你的脚本如何读取传入的消息(我现在不用perl),但我认为应该使用循环来继续读取传入的消息。 所以syslog-ng应该在启动时启动一次脚本,它应该继续运行和处理消息。

HTH,

此致 罗伯特·费克特

答案 1 :(得分:0)

我弄明白了这个问题。我的while循环没有正确构建:

#!/usr/bin/perl

$|=1;

use strict;
use warnings;

my $filename = "/tmp/zen.log";
open(my $fh, '>', $filename) or die "could not open file '$filename' $!";

my $my_string;

while( <> ) {
    $my_string .= $_;
    print $fh "$my_string\n";
};