eXtreme Development

Java - parsear log GC

hoje nós precisamos parsear mais uma vez um log de gc o log tem várias entradas com formatos diferentes, mas, no nosso caso nós só precisamos parsear p/ formato abaixo:

1314624K->62592K(1314688K), 0.9133758 secs] 1360564K->202013K(3083136K) icms_dc=14 , 0.9136032 secs] Times: user=0.11 sys=0.00, real=0.91
a jvm é 1.6 rodando um hpux (opsc gold) e tem parâmetros compatíveis com a hotspot, mas, não pude confirmar (não tive acesso ao java -version, apenas ao log) na linha acima, só nos interessava o segundo agrupamento de valores "1360564K->202013K(3083136K)" e o tempo "real=0.91" e nós parseamos assim grep -i "^:" <arquivo_log> | awk '{print $5 " " $13 }' | sed 's/\K->/\;/g' | sed 's/\K(/\;/g' | sed 's/\K) real=/\;/g' a saída é um csv assim: 1360564;202013;3083136;0.91 o primeiro valor é a old generation antes do gc o segundo valor é a old generation depois do gc o terceiro valor é a heap total o quarto valor é o tempo total do gc em ms e vale lembrar que esse parser não suporta o formato abaixo (ainda)
1252096K->62592K(1314688K), 0.7760772 secs] 1256522K->108622K(3083136K), 0.7762657 secs] Times: user=0.08 sys=0.00, real=0.78
claro, ainda dá p/ melhorar muito, mas, isso fica p/ próximas vezes que eu precisar usar esse cara...

na expectativa de ser útil p/ mais alguém, a gente foi parsear um log de gc (hotspot) que tinha esse formato: 0.594: [GC Desired survivor size 536870912 bytes, new threshold 7 (max 15) [PSYoungGen: 125829K->928K(3670016K)] 125829K->928K(20447232K), 0.0076560 secs] Times: user=0.04 sys=0.00, real=0.01 0.602: [Full GC (System) [PSYoungGen: 928K->0K(3670016K)] [ParOldGen: 0K->732K(16777216K)] 928K->732K(20447232K) [PSPermGen: 7185K->7181K(21248K)], 0.0901410 secs] Times: user=0.16 sys=0.01, real=0.09 ... Heap PSYoungGen total 4061056K, used 564773K [0x0000002ea17a0000, 0x0000002fa17a0000, 0x0000002fa17a0000) eden space 3919680K, 14% used [0x0000002ea17a0000,0x0000002ec3ec1510,0x0000002f90b70000) from space 141376K, 0% used [0x0000002f98d90000,0x0000002f98df8000,0x0000002fa17a0000) to space 133248K, 0% used [0x0000002f90b70000,0x0000002f90b70000,0x0000002f98d90000) ParOldGen total 16777216K, used 9554381K [0x0000002aa17a0000, 0x0000002ea17a0000, 0x0000002ea17a0000) object space 16777216K, 56% used [0x0000002aa17a0000,0x0000002ce8a135a8,0x0000002ea17a0000) PSPermGen total 101632K, used 80553K [0x0000002a997a0000, 0x0000002a9fae0000, 0x0000002aa17a0000) object space 101632K, 79% used [0x0000002a997a0000,0x0000002a9e64a6a0,0x0000002a9fae0000) e a abordagem que a gente acabou usando pelo cygwin foi essa: grep ':' arquivo.log | cut -f1 -d':' | grep -v '\[' > saida1.log o primeiro grep pega apenas as linhas que tem ':' o cut pega o primeiro campo antes do ':' (tempo) o segundo grep remove todas as linhas que contenham '[' (o '\' na frente do '[' deve ser usado por causa do escape...) e todo esse texto é redirecionado para saida1.log grep -i "real=" arquivo.log | rev | cut -d' ' -f1-3 | rev | cut -d' ' -f1 | cut -c6- > saida2.log o primeiro grep pela apenas as linhas que tem "real=" o rev inverte as strings (é usado p/ simplificar o processo, já que agora o campo final aparece como campo inicial) o cut serve para pegar os 3 primeiros campos (que na realidade são os 3 últimos na string original) o rev inverte para a string original o cut pega o primeiro campo separado por espaço em branco o cut pega dos 6 primeiros caracteres até o fim da string e todo esse texto é redirecionado para saida2.log paste saida1.log saida2.log > saida-final.log o paste junta a primeira linha do saida1.log com a primeira linha do saida2.log e faz o mesmo passo até o fim dos arquivos depois, todo esse texto é redirecionado para saida-final.log



SourceForge BootStrap