syslog-ng perl 管道丢弃事件
syslog-ng perl pipe dropping events
我正在尝试通过 syslog-ng 将 syslogs 通过管道传输到 perl 脚本,但并非所有 syslog 条目都能通过 - 可能实际发生了三分之一。
我找遍了所有地方,但找不到远程遇到我遇到的问题的人。看起来很简单,但我找不到答案!
这是我的 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";
};
有什么想法吗?
您的 Perl 行缓冲区是否被禁用?
根据 syslog-ng manual,它可能会导致一些问题:
"Certain external applications buffer the log messages, which might cause unexpected latency and other problems. For example, if you send the log messages to an external Perl script, Perl uses a line buffer for terminal output and block buffer otherwise. You might want to disable buffering in the external application."
此外,我不知道您的脚本如何读取传入的消息(我现在不知道 perl),但我认为它应该使用循环来继续读取传入的消息。
所以 syslog-ng 应该在启动时启动脚本一次,并且它应该保持 运行 和处理消息。
HTH,
此致,
罗伯特·菲克特
我想通了。我的 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";
};
我正在尝试通过 syslog-ng 将 syslogs 通过管道传输到 perl 脚本,但并非所有 syslog 条目都能通过 - 可能实际发生了三分之一。
我找遍了所有地方,但找不到远程遇到我遇到的问题的人。看起来很简单,但我找不到答案!
这是我的 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";
};
有什么想法吗?
您的 Perl 行缓冲区是否被禁用?
根据 syslog-ng manual,它可能会导致一些问题:
"Certain external applications buffer the log messages, which might cause unexpected latency and other problems. For example, if you send the log messages to an external Perl script, Perl uses a line buffer for terminal output and block buffer otherwise. You might want to disable buffering in the external application."
此外,我不知道您的脚本如何读取传入的消息(我现在不知道 perl),但我认为它应该使用循环来继续读取传入的消息。 所以 syslog-ng 应该在启动时启动脚本一次,并且它应该保持 运行 和处理消息。
HTH,
此致, 罗伯特·菲克特
我想通了。我的 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";
};