Eu abordaria isso com um script awk, abaixo. O script procura as strings "obtenção" e "obtidas". O caso típico é que ele encontra primeiro a string "obtenção", seguida da string "obtida"; Se uma linha "obtida" for encontrada primeiro, d1
será desconsiderada ou zero, portanto, ela não será informada. Caso contrário, extraímos a parte principal da data (antes da vírgula), convertemos isso em segundos desde a época e, em seguida, adicionamos os milissegundos novamente. Esse valor é salvo em d1
.
Uma vez que a string "obtida" é vista, sua data é calculada da mesma maneira, então verificamos a diferença; se for mais de 2 segundos, nós reportamos. De qualquer maneira, redefinimos d1
para iniciar o processo novamente.
Salve o arquivo abaixo em um script, nomeie o que quiser (talvez alert-jdbc.awk
) e execute-o com awk -f alert-jdbc.awk < log-file-here
.
O script requer o utilitário de data GNU para converter datas arbitrárias.
/DEBUG Obtaining JDBC connection/ {
split($1 " " $2, dates, /,/)
"date -d \"" dates[1]"\" +%s" | getline seconds
d1=seconds + dates[2]/1000
}
/DEBUG Obtained JDBC connection/ {
if (d1) {
split($1 " " $2, dates, /,/)
"date -d \"" dates[1]"\" +%s" | getline seconds
d2=seconds + dates[2]/1000
if (d2 - d1 > 2) {
print "More than 2 seconds for: " $0
}
d1=0
}
}