如何使用 Apache Piped Logs 通过正则表达式实时替换日志中不需要的数据?

如何使用 Apache Piped Logs 通过正则表达式实时替换日志中不需要的数据?

我有由 Apache 生成的 https_acces_log 日志文件,某个 Web 应用程序正在将不需要的数据记录到文件中。我无法阻止该应用程序记录数据,因此我想编写一个 perl/python 脚本,该脚本将获取 Apache 输出的数据并在其上运行正则表达式以实时替换数据。

假设 Perl 是正确的工具,那么这就是我目前的情况。脚本现在没有输出。有人能帮忙吗?

$|=1;                               # Use unbuffered output
while (<STDIN>)                     # Loop through STDIN
{
    $Msg = $_;                      # Capture the line of input

    if ($Msg =~ m/&passwd=\w+GET/ )         #   Look for the string I don't want
    {
        $Msg =~ s/&passwd=\w+GET/&password=XXXXXXGET/g;
        print $Msg;                 # Print it
    }
    else
    {
        print $Msg\n;
    }
}

答案1

我可能弄错了,但我相信您需要让脚本处理打开和写入您期望的日志文件。Apache 不会捕获脚本的标准输出并将其放在日志文件中。

我不会使用管道日志运行自己的自定义脚本,但我会使用 rotatelogs,并且您必须为其提供要写入的日志文件的路径。例如:

CustomLog“|/usr/sbin/rotatelogs /var/log/httpd/ssl_access_log 86400”常见

答案2

最后一条打印语句有错误 - 如果不加引号,则无法使用\n。但没有必要,因为$Msg仍然应该有一个换行符,所以你可以直接使用print $Msg。如果你使用,-w这将触发警告(“未打开的文件句柄”),因此与你的模式不匹配的行将不是根本无法打印。

删除该脚本似乎有效 - 即,它将 &passwd=testGET 替换为 &password=XXXXXXGET。这就是您需要的吗?

编辑:我认为您在实际尝试在 Apache 上使用它之前已经在命令行中尝试过它。如果您已经在 Apache 中测试它,请参阅@TCampbell 的答案。

修改 2:如果您还没有这样做,请使用perl -w或。还请考虑。总的来说,您会成为一个更快乐的人。use warningsuse strict

答案3

好吧,如果您需要这样做,这里有一个关于如何在 syslog 中创建管道的示例:

首先使用 mkfifo 创建一个命名管道:


mkfifo -p /home/data/syslog.pipe

使 syslog.conf 指向此文件:


*.info |/home/data/syslog.pipe
重新启动系统日志:

sudo pkill -HUP syslogd
创建读取管道的处理脚本
$ cat > foo
cat /home/data/syslog.pipe | 读取输入时
echo“做一些事情”${input}
完毕

但请小心,如果消息到达的速度比我们的程序处理的速度快,则可能没有损坏的消息。

相关内容