Imprimindo linhas com texto semelhante juntos

2

Atualmente, estou trabalhando na análise do desempenho de um aplicativo. Comecei examinando os logs gerados por nosso aplicativo e identificando as tarefas de lógica de negócios que estão demorando mais do que o tempo aceitável para execução.

Um snippet do arquivo de log é parecido com:

2014-07-02 18:03:20,269 INFO  [ROOT] - Task1. xmlRecord Id :35165 processed
2014-07-02 18:05:20,269 INFO  [ROOT] - Task1. xmlRecord Id :35162 processed
2014-07-02 18:15:20,269 INFO  [ROOT] - Task1. xmlRecord Id :35164 processed
2014-07-02 18:20:20,269 INFO  [ROOT] - Task2. xmlRecord Id :35165 processed

Meu requisito é encontrar o tempo total gasto na execução de cada tarefa. Por exemplo, a quantidade de tempo gasto na Tarefa2 para xmlRecord 35165 = Hora final da Tarefa 2 para xmlRecord 35165 - Hora Final da Tarefa 1 para xmlRecord 35165.

Por esse motivo, quero uma maneira de agrupar todas as declarações de log com o mesmo xmlRecord Id a serem agrupadas, conforme mostrado abaixo:

2014-07-02 18:03:20,269 INFO  [ROOT] - Task1. xmlRecord Id :35165 processed
2014-07-02 18:20:20,269 INFO  [ROOT] - Task2. xmlRecord Id :35165 processed
2014-07-02 18:05:20,269 INFO  [ROOT] - Task1. xmlRecord Id :35162 processed
2014-07-02 18:15:20,269 INFO  [ROOT] - Task1. xmlRecord Id :35164 processed

Se eu puder agrupar todas as instruções de log como mostrado acima, rapidamente poderei ver que foram necessários 17 minutos para que a Task2 processasse xmlRecord 35165.

Observe que os logs que mostrei aqui não são os registros exatos que meu aplicativo imprime, mas apenas uma amostra. Eu quero ser capaz de agrupar todas as instruções de log de tal forma que os logs para um determinado ID XML são sempre um após o outro.

Estou um pouco enferrujado com a concha e ficaria feliz se alguém pudesse me indicar um roteiro ou um script que já faz isso, para que eu não perca tempo reinventando a roda.

    
por CKing 03.07.2014 / 09:16

2 respostas

5

Como inicial, por que não classificar na coluna xmlRecord Id ? : -

sort -k 9 -o <out.log> <in.log>

Isso deve agrupá-los em ordem numérica. Se você quiser classificar por Task também, isso provavelmente envolverá um script awk ou similar.

Como isso funciona

O comando sort pode classificar os dados de várias maneiras, neste caso, estamos classificando-os com base no valor da 9ª coluna. Ele usará um tipo alfanumérico padrão, a menos que seja indicado de outra forma.

.... -k 9 ....

Os outros argumentos no exemplo são apenas para especificar qual arquivo de entrada usar (seu arquivo de log) e um novo arquivo para gerar os resultados, -o <out.log> .

    
por 03.07.2014 / 09:44
2

Se você tiver memória suficiente para carregar o arquivo inteiro, tente:

$ perl -ane '
    push @h, [$F[1],(split(/:/,$F[8]))[1],$_];
    END {
        print map { $_->[2] }
              sort { $b->[1] <=> $a->[1]
                     ||
                     $a->[0] cmp $b->[0]
                   }
              @h;
    }
' file
2014-07-02 18:03:20,269 INFO  [ROOT] - Task1. xmlRecord Id :35165 processed
2014-07-02 18:20:20,269 INFO  [ROOT] - Task2. xmlRecord Id :35165 processed
2014-07-02 18:15:20,269 INFO  [ROOT] - Task1. xmlRecord Id :35164 processed
2014-07-02 18:05:20,269 INFO  [ROOT] - Task1. xmlRecord Id :35162 processed

Explicação

  • Durante o processamento do arquivo, criamos uma matriz @h , cada um dos seus elementos é uma matriz ref. Cada matriz ref contém três elementos:

    • A hora aparece no arquivo de log, como 18:03:20,269
    • O ID do registro XML
    • A entrada de registro inteira
  • Final, imprimimos o resultado com a condição:

    • classificar por ID de registro XML primeiro $b->[1] <=> $a->[1] , reversamente
    • Se o ID for igual, comparamos quando aparecem no log $a->[0] cmp $b->[0]
por 03.07.2014 / 10:18