rat_guedes
(usa Ubuntu)
Enviado em 18/11/2014 - 18:34h
Prezados,
Estou necessitando de ajuda para a elaboração de um Shell Script, visto que meu conhecimento de comandos Linux é bem limitado.
Meu problema é o seguinte: Preciso escrever um script que faça a analise do log de um job Java.
Esse script deve varrer o arquivo de log em busca da expressão 'ERROR' e escrever em um arquivo chamado 'alerta.out', na mesma pasta do script, as linhas que contém tal expressão.
Caso não encontre nenhum 'ERROR', tal arquivo não deverá ser criado.
Esse script será chamado periodicamente por uma ferramenta de monitoramento e operação assistida, que dará alertas caso haja erros no job (ou seja, caso encontre o arquivo 'alerta.out').
Como o arquivo de log geralmente é muito grande, e também para que não sejam gerados alertas repetidos, o script deverá guardar de alguma maneira a última linha verificada, para que na próxima execução continue somente daí.
Pois bem, como o log do job é formatado em um padrão fixo, pelo Log4j, decidi armazenar em um arquivo chamado 'ult_dt_hr_verificada.out' o inicio da última linha verificada, que contém a data e hora.
A partir daí, o algoritmo seria procurar por essa data/hora no arquivo, descobrir o número dessa linha, e então procurar pelo padrão 'ERROR' somente dessa linha em diante, até o final do arquivo.
Começei a desenvolver o script, mas tive problemas com caracteres especiais no comando grep, entre outros.
A seguir, um exemplo de um trecho do arquivo de log:
[12/11/2014 10:42:05] [ INFO] {Carregador.java->processarArquivos} Removendo notas fiscais eletronicas invalidas...
[12/11/2014 10:42:75] [ INFO] {Carregador.java->processarArquivos} Carregando notas fiscais eletronicas...
[12/11/2014 10:43:13] [ ERROR] {Carregador.java->processarArquivos} Processando nota 211200084. Ocorreu um erro! Finalizando...
[12/11/2014 10:43:20] [ INFO] {Carregador.java->run} Processamento de carga de notas fiscais eletronicas finalizado.
O arquivo 'alerta.out' deveria ser criado com o conteúdo "[12/11/2014 10:43:13] [ ERROR] {Carregador.java->processarArquivos} Processando nota 211200084. Ocorreu um erro! Finalizando..." e o arquivo 'ult_dt_hr_verificada.out' deveria ser criado com o conteúdo "[12/11/2014 10:43:20]".
Eis o meu script, até o momento:
#! /bin/bash
FILE_DT_HR=ult_dt_hr_verificada.out
FILE=/u02/portal-j04.log
if [ -e "$FILE_DT_HR" ] ;
then
ULT_DATA_HORA_VERIFICACAO=$(tail -n 1 $FILE_DT_HR);
echo "Na execução anterior, a última linha verificada foi a de Data/Hora $ULT_DATA_HORA_VERIFICACAO";
else
echo "Arquivo $FILE_DT_HR necessário não encontrado. O script irá terminar. Para resolver o problema, criar este arquivo na mesma pasta do script, que deverá conter a informação de Data/Hora a partir da qual o script irá iniciar a varredura por erros, no formato [dd/MM/AAAA hh:mm:ss]";
exit 1;
fi
rm -f alerta.out
rm -f $FILE_DT_HR
ERROR=$(grep ERROR $FILE);
if [ ${#ERROR} -gt 1 ];
then
echo "Erro encontrado! Arquivo alerta.out gerado.";
echo "$ERROR">alerta.out;
#
#Exibida somente para teste
LINHA_ERRO=$(grep -n ERROR $FILE);
NUM_LINHA_ERRO=${LINHA_ERRO%%:*};
echo "Linha com erro ${NUM_LINHA_ERRO}";
#
#Calcula o total de linhas do arquivo
TOTAL_LINHAS=$(wc -l $FILE);
NUM_TOTAL_LINHAS=${TOTAL_LINHAS%% *};
echo "Total de linhas do arquivo: ${NUM_TOTAL_LINHAS}"
#
#Aqui dá erro. Seria necessário descobrir o numero da ultima linha verificada
ULT_LINHA_VERIFICADA=$(grep -n ${ULT_DATA_HORA_VERIFICACAO} $FILE);
echo "Numero da ultima linha verificada: ${ULT_LINHA_VERIFICADA}";
#
else
echo "Nenhum erro encontrado (busca realizada no arquivo $FILE pela string ERROR).";
fi
tail -n 1 $FILE | cut -c 1-21 > ult_dt_hr_verificada.out;
DT_HR_ULT_LINHA_VERIFICADA=$(tail -n 1 ult_dt_hr_verificada.out);
echo "Nesta execução, a última linha verificada foi a de Data/Hora $DT_HR_ULT_LINHA_VERIFICADA";
Ao tentar fazer "ULT_LINHA_VERIFICADA=$(grep -n ${ULT_DATA_HORA_VERIFICACAO} $FILE);" para pegar o número da última linha verificada, para então diminuir do total de linhas e verificar somente o resultado com "tail -n RESULTADO $FILE", dá um erro no grep.
Alguma sugestão, inclusive de um outro algoritmo, talvez mais simples ou melhor elaborado? Grato.