Gerando LOG de execução de scripts

Cada administrador de redes/datacenter tem sua própria forma de administrar servidores/serviços. Uma coisa que todo mundo faz, ou pelomenos deveria fazer é a avaliação de logs.

Quando estamos falando em recursos nativos do sistema operacional, eles já vem programados para serem logados pelo syslogd, gerando assim output em diferentes arquivos dentro de /var/log/<tipo>.

Mas e quando estamos falando de análise de logs daquelas rotinas de automação implementadas por nós mesmos?? Como gerar estes logs e administrá-los de forma simples e objetiva?Existem variadas formas de se fazer. Nesse POST estão algumas das formas que conheço e utilizo bastante…

Uma delas é através do comando logger, que gera entradas nos logs do syslogd. Para utilizá-lo basta fazer algo do tipo:

#!/bin/sh
echo "Inicio de rotina.." | logger
comando_01 | logger
comando_02 # esse não quero output...
comando_n | logger
echo "Fim de rotina.." | logger

Através do “logger”, a entrada no log já acontece com timestamp e usuário, conforme abaixo:

hudson@vostrolab:~$ tail -3 /var/log/messages
Aug 23 11:55:37 vostrolab logger: Inicio de rotina...
Aug 23 11:55:51 vostrolab logger: tramite
Aug 23 11:56:00 vostrolab logger: Fim de rotina

Outra forma que é amplamente utilizada é o Administrador criar um arquivo de log e jogar todo output desejado dentro, criando seu próprio timestamp conforme abaixo:

#!/bin/sh
LOG=/var/log/arquivo.log
echo "[`date`] ==== Inicio de rotina..." >> $LOG
comando_01 >> $LOG
comando_02 # esse não quero output...
comando_n >> $LOG
echo "[`date`] ==== Fim de rotina..." >> $LOG

Esse método acima é ótimo, e possibilita gravar em log apenas pontos específicos do shellscript.. O output fica mais ou menos assim:

[Sun Aug 23 12:03:53 BRT 2009] ==== Inicio de rotina...
output do tramite de comandos
[Sun Aug 23 12:04:01 BRT 2009] ==== Fim de rotina...

Existe outra forma bem conhecida e menos “suja” pro código, de gravar toda a saída de um script em um arquivo de log.. com uma desvantagem de não se conseguir especificar exatamente os pontos que se deseja gravar no log…
Segue:

#!/bin/sh
LOG=/var/log/arquivo.log
exec 1>>${LOG}
exec 2>&1
echo "[`date`] ==== Inicio de rotina..."
comando_com_output01
comando_com_output02
echo "[`date`] ==== Fim de rotina..."

Assim não é necessário ficar colocando “>>” para redirecionar a saída em todos os comandos… basta fazer o comando dentro do script e todo o STDOUT e STDERR será colocado no log especificado.

Boas práticas que recomendo:

1. Não use mais de 01 arquivo de log por script, pois dificulta a administração depois;
2. Faça logs bonitos e organizados, você vai ver como isso é importante o dia que tiver que levar um log impresso na mesa da diretoria de sua empresa;
3. Crie um diretório /var/log/scripts_locais/ para armazenar os logs de todos os scripts customizados de rotina de determinado sistema operacional;
4. Dentro desse diretório acima, tente usar o nome do shell para gerar o log;

Pode ser algo mais ou menos assim na hora de definir a variavel LOG:

SCRIPT=`basename $0`
LOG=`echo /var/log/scripts/$SCRIPT | sed s/'.sh'/'.log'/g`

Fica aí a dica!! 😉 Se achar interessante em algum caso, aproveite…

Por: Hudson Murilo dos Santos
Referências:

man logger
man bash

3 thoughts on “Gerando LOG de execução de scripts

Leave a Comment

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *