Extrair 2 datas do arquivo de log com padrões específicos e comparar as 2 datas

0

Parece que tenho problemas com a minha ferramenta do conjunto de conexões. Há um grande atraso quando ele obtém a conexão do banco de dados.
O que eu tento conseguir é pegar todos os casos do arquivo de log quando este incidente ocorrer.

As entradas de registro relacionadas parecem

...
2018-03-12 16:18:44,070 efault task-166 gine.jdbc.internal.LogicalConnectionImpl DEBUG Obtaining JDBC connection
...
2018-03-12 16:20:23,172 efault task-166 gine.jdbc.internal.LogicalConnectionImpl DEBUG Obtained JDBC connection
...

Portanto, se o padrão ' DEBUG Obtendo conexão JDBC ' ocorrer, extraia a data ' 2018-03-12 16: 18: 44.070 ' e quando o padrão '< strong> DEBUG Obtido conexão JDBC 'é encontrado, em seguida, extrair sua data e comparar as 2 datas. Se a diferença for maior que 2 segundos, registre então.

Eu sei que é bastante complicado resolvê-lo com uma linha de código, mas é possível sem escrever um programa para fazer isso?

    
por Viktor 16.05.2018 / 10:19

2 respostas

2

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
  }
}
    
por 16.05.2018 / 15:12
2

Tente isto:

Delay=$(( 
  ($(date -d "'awk '/DEBUG Obtained JDBC connection/{print $1" "$2}' file.log |
  cut -d ',' -f1 | tail -n1'" +%s)) -
  ($(date -d "'awk '/DEBUG Obtaining JDBC connection/{print $1" "$2}' file.log |
  cut -d ',' -f1 | tail -n1'" +%s)) ))
echo "$Delay Sec"

explicará o comando se ele funcionar para sua necessidade.

    
por 16.05.2018 / 11:01