【问题标题】:syslog-ng perl pipe dropping eventssyslog-ng perl 管道丢弃事件
【发布时间】:2015-06-04 03:28:25
【问题描述】:

我正在尝试通过 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";

};

有什么想法吗?

【问题讨论】:

  • 仅供参考,我已经尝试过 flush_lines (1),但没有帮助。我也在同时登录到其他地方并且日志正在适当地发生,只有这个目的地参差不齐。
  • 这可以告诉您日志生成的频率吗?如果日志很频繁,那么我建议在两者之间使用 unix 域套接字。它在我的用例中非常适合我。
  • 它实际上不是很频繁,但一次可以以 5 个为一组。也许每 10 秒一次,我会得到 1-5 个日志条目。我不确定我是否完全理解域 unix 套接字是我会在我的 perl 脚本或其他地方使用的东西吗?
  • 你能把你的代码用while循环放在这里吗?此外,我认为您不需要任何类型的套接字来使用。套接字放置在 syslog 和 perl 脚本之间,因此流程类似于 syslog ==&gt; socket ==&gt; perl script。您的情况下的日志率不是很多。
  • 与conf文件中的速率限制无关?

标签: linux perl syslog syslog-ng


【解决方案1】:

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

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

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

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

HTH,

问候, 罗伯特·费克特

【讨论】:

  • 我试过用$|=1关闭缓冲,实际上我有一个while ( &lt;STDIN&gt; ) { }循环但没有骰子!感谢您的见解。
  • 愚蠢的想法,使用 while ( 1 ) 而不是 while ( )? (或者总是正确的东西,以避免脚本退出)
【解决方案2】:

我发现了问题所在。我的 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";
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多