我有由Apache生成的https_acces_log日志文件,某个Web应用程序将不需要的数据logging到文件中。 我不能阻止应用程序logging数据,所以我想写一个perl / python脚本,它将获取Apache输出的数据,并运行一个正则expression式来实时replace数据。
假设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; } }
我可能在这里弄错了,但我相信你需要让你的脚本处理打开并写入你期望的日志文件。 Apache不会捕获您的脚本的标准输出并将其放置在日志文件中。
我不使用pipe道日志运行自己的自定义脚本,但是我使用了rotatelogs,并且必须为其提供写入日志文件的path。 如:
CustomLog“| / usr / sbin / rotatelogs / var / log / httpd / ssl_access_log 86400”常见
您在最后的打印语句中有错误 – 您不能使用\n而不引用它。 这不是必须的,因为$Msg应该还有一个换行符,所以你可以使用print $Msg 。 如果你使用-w这会触发一个警告(“未打开的文件句柄”),所以不符合你的模式的行将不会被打印。
删除你的脚本似乎工作 – 也就是说,它取代&passwd = testGET&password = XXXXXXGET。 那是你需要的吗?
编辑:我把它,你试图在命令行之前,实际上试图在Apache上使用它。 如果您已经在Apache中testing了,请参阅@ TCampbell的答案。
编辑2:使用perl -w或者use warnings如果你还没有做。 另外考虑use strict 。 你会是一个更快乐的人。
那么如果你需要这样做的话,有一个关于如何在syslog中创buildpipe道的例子:
首先使用mkfifo创build一个命名pipe道:
mkfifo -p /home/data/syslog.pipe
使syslog.conf指向这个文件:
*.info |/home/data/syslog.pipe
重新启动系统日志:
sudo pkill -HUP syslogd
创build读取pipe道的处理脚本
$ cat> foo
cat /home/data/syslog.pipe | 同时读取input
做
回声“做一些东西”$ {input}
DONE
但要小心,如果他们到达的速度比我们的程序能够处理的速度快,那么您可能没有任何损坏的消息。