我有由 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 warnings
use 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} 完毕
但请小心,如果消息到达的速度比我们的程序处理的速度快,则可能没有损坏的消息。