У меня есть файлы журнала https_acces_log, созданные Apache, что определенное веб-приложение регистрирует нежелательные данные в файле. Я не могу помешать приложению регистрировать данные, поэтому я хотел бы написать скрипт 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;
}
}
Я могу ошибаться здесь, но я считаю, что вам нужно открыть дескриптор скрипта и записать в файл журнала, который вы ожидаете. Apache не будет захватывать стандартный вывод вашего скрипта и помещать его в файл журнала.
Я не запускаю свои собственные сценарии с конвейерными журналами, но я использую rotatelogs, и вы должны указать ему путь к файлу журнала для записи. Такие как:
CustomLog "| / usr / sbin / rotatelogs / var / log / httpd / ssl_access_log 86400" общий
У вас есть ошибка в последнем операторе печати - вы не можете использовать \n
не цитируя его. Но это не нужно, так как $Msg
должен по-прежнему иметь новую строку, поэтому вы можете просто использовать print $Msg
. Если вы используете -w
это вызовет предупреждение ("неоткрытый дескриптор файла"), поэтому строки, не соответствующие вашему шаблону, будут не печататься вообще.
Удаление того, что ваш скрипт кажется работающим, то есть заменяет & passwd = testGET на & password = XXXXXXGET. Это то, что вам нужно?
Изменить: я понял, что вы пробовали это в командной строке, прежде чем фактически пытались использовать его на Apache. См. Ответ @ TCampbell, если вы уже тестируете его в Apache.
Изменить 2: использовать perl -w
или use warnings
если вы этого еще не делаете. Также учтите use strict
. В целом вы станете более счастливым человеком.
Что ж, если вам нужно это сделать, есть пример того, как создать канал в syslog:
Сначала создайте именованный канал с помощью mkfifo:
mkfifo -p /home/data/syslog.pipe
Сделайте syslog.conf указателем на этот файл:
*.info |/home/data/syslog.pipe
Restart syslog:
sudo pkill -HUP syslogd
Create processing script that read the pipe $ cat > foo cat /home/data/syslog.pipe | while read input do echo "Do some stuff" ${input} done
Но будьте осторожны, вы можете не получить искаженные сообщения, если они приходят быстрее, чем наша программа может их обработать.