Назад | Перейти на главную страницу

Как использовать Apache Piped Logs для регулярного выражения замены нежелательных данных в журналах в реальном времени?

У меня есть файлы журнала 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

Но будьте осторожны, вы можете не получить искаженные сообщения, если они приходят быстрее, чем наша программа может их обработать.