Como usar o Apache Piped Logs para regex substituir dados indesejados nos logs em tempo real?

1

Eu tenho arquivos de log https_acces_log sendo gerados pelo Apache que um determinado aplicativo da web está registrando dados indesejados no arquivo. Eu não consigo parar o aplicativo de registrar os dados, então eu gostaria de escrever um script perl / python, que terá os dados de saída do Apache e executar um regex sobre ele para substituir os dados em tempo real.

Assumindo que o Perl é a ferramenta certa, aqui é onde eu estou até agora. Script não produz saída agora. Ajudar alguém?

$|=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;
    }
}
    
por Tad 29.06.2011 / 18:48

3 respostas

2

Eu posso estar enganado aqui, mas eu acredito que você precisaria ter o seu manuscrito abrindo e escrevendo no arquivo de log que você está esperando. O Apache não captura o stdout do seu script e o coloca no arquivo de log.

Eu não executo meus próprios scripts personalizados com logs canalizados, mas eu uso rotatelogs e você tem que dar o caminho para o arquivo de log para escrever. Tais como:

CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/ssl_access_log 86400" common

    
por 29.06.2011 / 18:55
1

Você tem um erro na última declaração de impressão - não é possível usar \n sem citá-lo. Não é necessário, pois $Msg ainda deve ter uma nova linha, então você pode usar apenas print $Msg . Se você estiver usando -w , isso acionará um aviso ("filehandle não aberto"), para que as linhas que não correspondam ao seu padrão sejam não impressas.

Remover o script parece funcionar, isto é, substitui & passwd = testGET por & senha = XXXXXXGET. É disso que você precisa?

Edit: Eu tomei isso você estava tentando isso na linha de comando antes de realmente tentar usá-lo no Apache. Veja a resposta do @ TCampbell se você já está testando no Apache.

Editar 2: use perl -w ou use warnings se você não estiver fazendo isso. Considere também use strict . Você será uma pessoa mais feliz no geral.

    
por 29.06.2011 / 18:56
0

Bem, se você precisar fazer isso, há um exemplo de como criar um canal no syslog:

Primeiro crie um pipe nomeado usando o mkfifo:


mkfifo -p /home/data/syslog.pipe

Faça o syslog.conf para apontar para este arquivo:


*.info |/home/data/syslog.pipe
Reinicie o syslog:

sudo pkill -HUP syslogd
Criar script de processamento que leia o pipe
$ cat > foo
cat /home/data/syslog.pipe | while read input
do
echo "Do some stuff" ${input}
done

Mas tenha cuidado, você pode não ter mensagens mutiladas se elas chegarem mais rápido do que o nosso programa pode processá-las.

    
por 29.06.2011 / 19:36