1

我正在尝试通过 syslog-ng 将系统日志通过管道传输到 perl 脚本,但并非所有系统日志条目都能通过 - 实际上可能有三分之一的情况发生。

我找遍了整个地方,找不到任何远程有我遇到的问题的人。看起来很简单,但我找不到答案!

这是我的 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";

};

有什么想法吗?

4

2 回答 2

0

你的 Perl 行缓冲被禁用了吗?

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

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

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

高温下,

问候,罗伯特·费克特

于 2015-06-05T09:00:38.667 回答
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";
};
于 2015-06-16T22:17:20.027 回答