Monitoramento de log usando script de shell

5

Eu gostaria de monitorar um arquivo de log por erros e, em seguida, enviar um email para administradores.

O arquivo de log contém dados como abaixo

11 Aug 02:30 Service1 restarted
11 Aug 05:35 Service1 restarted
11 Aug 08:43 Service2 restarted
11 Aug 11:20 Service1 restarted
11 Aug 14:53 Service2 restarted

Eu gostaria de criar um script que seja executado a cada 5 minutos e verifique a última ocorrência de reinicialização do serviço e envie um email.

Por exemplo: se o script for executado às 02:35, ele verá que Service1 foi reiniciado, por isso enviará um e-mail como Service1 restarted at 02:30 . Agora, quando o script é executado às 5:45, ele deve enviar e-mail que Service1 reiniciou às 05:35 somente (não deve incluir a reinicialização 02:35)

Existe uma maneira de atingir esse requisito? Eu sou basicamente novo em scripts Linux e Shell

    
por YRVK 11.08.2015 / 15:03

5 respostas

4

Comece fazendo um crontab de cinco minutos:

*/5 * * * * myscript.sh

Que executa myscript.sh (em $HOME dir)

 #!/bin/bash
 tail -1 /path/to/file.log > /some/dir/after
 if cmp -s /some/dir/after /some/dire/before
 then
     cat /some/dir/after | mail -s "restart" [email protected]
     cp /some/dir/after /some/dir/before
 fi

Com os valores corretos (claro).

Observe que isso implica que não haverá duas reinicializações em cinco minutos.

    
por 11.08.2015 / 15:42
3

Eu assumo que às 02:35, a última linha do arquivo será o reinício de 02:30, então tudo que você precisa é de uma entrada no cron que pareça

*/5 * * * * tail -1 /path/to/file.log | mailx -s "Last restart" [email protected]

A desvantagem dessa abordagem é que o administrador receberá o mesmo email às 02:35, 02:40, 02:45, ...

    
por 11.08.2015 / 15:35
2

Tente isto:

crontab

*/5 * * * * /path/to/checklog.bash

Script

#!/bin/bash

service=$(tail -1 /path/to/logfile | awk '{print $4}')
logdate=$(tail -1 /path/to/logfile | awk '{print $1,$2,$3}')

if  test 'find "/path/to/logfile" -mmin -5'
then
    echo "$service was restarted on $logdate" | mail -s "Restart notification" [email protected]
fi
    
por 11.08.2015 / 16:04
0

Uma melhoria na resposta fornecida por @glenn-jackman seria usar a opção -E do mailx . Na página man do mailx:

-E

Do not send messages with an empty body. This is useful for piping errors from cron(8) scripts.

    
por 22.02.2017 / 22:04
0

Uma maneira mais confiável de lidar com isso seria usar uma ferramenta criada para o cenário exato que você tem em mente (que é monitorar um log e enviar e-mails para fora em padrões recém-detectados).

Faça o download desta ferramenta

Depois de descompactá-lo e executá-lo, você verá muitos exemplos da vida real que pode imitar. O único exemplo em que você deseja se concentrar é o MODEL13, que aborda a tarefa de enviar notificações por e-mail para endereços de e-mail específicos sempre que um padrão é detectado em um ou vários registros diferentes.

./logrobot localhost /var/tmp/logXray autonda /var/log 60m '.*error.*_P_.*fatal.*' '.'  1 1 errchk -ndshow [email protected]

No comando acima, abaixo estão os parâmetros que você deve alterar, como achar melhor:

  • '. * erro. * _ P _. * fatal. *' - aqui, dois padrões estão sendo pesquisados em todos os registros no diretório / var / log

  • / var / log - este é o diretório cujos logs você deseja monitorar. Se você deseja monitorar um arquivo de log específico, substitua-o pelo caminho absoluto para o arquivo de log.

  • 1 - Enviar um alerta de aviso se 1 entrada for encontrada no (s) registro (s)
  • 1 - Enviar um alerta crítico se 1 entrada for encontrada no (s) registro (s)
    • Se o aviso e a crítica forem os mesmos, a verificação alertará como crítica quando o padrão monitorado for encontrado nos registros.
  • errchk - Esta é a tag para essa verificação de log específica. Dê um nome merecedor ... um nome que corresponda ao tipo de log (s) sendo monitorado (s) ... ou seja, tomcatLogCheck
  • E, claro, o email =. Altere isso para os endereços de e-mail apropriados.

Esta é uma opção melhor porque inclui a lógica necessária para garantir que apenas novas linhas adicionadas ao (s) registro (s) monitorado (s) sejam verificadas. Também é muito mais eficiente. E também deve ser portátil.

Claro, verifique se o postfix está instalado no host para que os e-mails possam ser enviados. Eu posso estar esquecendo alguma coisa aqui, mas essa deve ser a essência de como a ferramenta funciona.

    
por 06.04.2017 / 08:46