Gerando arquivos de log com shell script

Introdução:
Shell Scripts são uma verdadeira mão na roda na administração de servidores Linux. Porém um assunto que é um tanto negligenciado neste aspecto é quanto ao registro da informação sobre o que foi feito durante a execução do script, até porque na maioria das vezes o script é executado via cron, e como você não pode ver as informações dele na tela, um arquivo ou sistema de log torna-se essencial.

Modo 1: Log via arquivo próprio
O modo mais simples de realizar o log é através de um arquivo próprio, exclusivo para sua aplicação. Existem diversas formas de se fazer isso, a que mostro a seguir é a que costumo utilizar. Considere o pequeno shell script (em bash) abaixo:



#!/bin/bash
WORKDIR="/root/my_script"
SESSION_LOG=${WORKDIR}/$$.log
LOGFILE=${WORKDIR}/my_script.log
DEST_DIR=${WORKDIR}/backups
DATE=$(date +"%Y-%m-%d_%H:%M:%S")

function LOG(){
DATA=$(date +"%Y-%m-%d %H:%M:%S")
echo ${DATA} $1 | tee -a ${SESSION_LOG}
}

LOG "Iniciando ..."
LOG "Trocando de diretorio"
cd /etc
LOG "Criando o arquivo compactado etc-${DATE}.tar.bz2 em /tmp"
tar -cvjf /tmp/etc-${DATE}.tar.bz2
LOG "Movendo o arquivo etc-${DATE}.tar.bz2 para o diretorio de destino ${DEST_DIR}"
mv /tmp/etc-${DATE}.tar.bz2 ${DEST_DIR}
LOG "Finalizado"

#Salva o log da sessão no log geral
cat  ${SESSION_LOG} >>  ${LOGFILE}

#Descomente para enviar o log da sessão para o usuário root
#mail -s "Log do backup de `date +%F`" root < ${SESSION_LOG}

#remove o log da sessão
rm -f  ${SESSION_LOG}


Nesse simples script, foi criada uma função de nome LOG que deve ser utilizada no formato LOG "Mensagem". Quando chamada, a função LOG imprime a mensagem passada na tela e também em um arquivo de log, definido na variável ${SESSION_LOG}. A vantagem de se utilizar uma função (ao invés de repetir o mesmo código por todo o script) é que, se for necessário alterar algo no código, a alteração é realizada apenas uma vez. Por exemplo, conferindo a página de manual do comando date, verifiquei que a opção %F é equivalente à %Y-%m-%d utilizada e resolvi trocá-la, para otimizar o código. Se não utilizasse uma função, teria de editar cinco linhas. Utilizando a função, basta editar apenas uma linha, independente de quantas vezes a função foi chamada. O script faz um backup do diretório /etc em um arquivo cujo nome é etc-data_hora.tar.bz2 e move esse arquivo para o diretório configurado na variável ${DEST_DIR}, sempre informando (no log de sessão e na tela) o que está sendo realizado. Por fim o script envia o log da sessão para o usuário root via email, concatena o log da sessão no log geral e apaga o arquivo de log da sessão. Esse script contém algumas coisas legais para quem está estudando shell. Um dos pontos fracos dele é que não é feito tratamento de erros. Erros devem ser sempre checados (e logados)

Modo 2: Log via syslog
existe o comando logger, que permite o envio de mensagens de log diretamente pelo protocolo SYSLOG, que gerencia os logs do sistema. Nesse caso, suas mensagens cairiam em um dos arquivos de log do sistema, como o /var/log/messages ou o /var/log/syslog. Fazendo algumas configurações no arquivo de configuração do servidor syslog (normalmente em /etc/syslog.conf). 
Desejando alterar o script acima para fazer log via syslog, basta alterar a função LOG, deixando-a desse jeito:

function LOG(){
DATA=$(date +"%Y-%m-%d %H:%M:%S")
echo ${DATA} $1 | tee -a ${SESSION_LOG}
logger $1
}

Também é necessário comentar a linha "cat  ${SESSION_LOG} >>  ${LOGFILE}", pois o arquivo de log será um dos arquivos de sistema, gerenciados pelo daemon do syslog.

Um comentário:

Alan Santos disse...

Obrigado amigo. Uso uma função bem parecida com essa em um script perl.

Usei essa para shellscript e ela funcionou muito bem também.

Abraços e sucesso!