Extrai parte dos logs para outro arquivo

0

1) Nós temos um arquivo process.log no qual temos muitos dados de texto e entre nós publicamos alguns dados XML.
2) Existem milhares de diferentes XML publicados nos logs junto com outros dados de texto. 3) Agora eu preciso selecionar apenas os arquivos XML que são publicados após o XML de saída: valor
4) Também o arquivo XML que deve ser selecionado e copiado para um novo arquivo deve ser o que corresponde ao valor na tag ALERTID . 5) O valor ALERTID será fornecido na entrada do script. Portanto, no nosso caso mGMjhgHgffHhhFdH1u4 será fornecido na entrada e precisamos selecionar o arquivo XML completo publicado para este alertid. A tag inicial é de <xml version..> e a tag final é </Alert>
5) Então eu preciso selecionar o arquivo XML de saída relevante em um novo arquivo baseado em um determinado ALERTID para que ele possa ser reproduzido em diferentes ambientes.

O formato do arquivo de log é o seguinte:

Info Jan 11 17:30:26.12122 The process is not responding to heartbeats
Debug Jan 11 17:30:26.12123  Incoming XML :<xml version "1.0" encoding ="UTF-8"?>
<Alert trigger = "true" >
<Alerttype>orderReject</Alerttype>
<AlertID>ghghfsjUtYuu78T1</AlertID>
<Order>uusingas</Order>
<Quantity>1254</Quanity>
</Alert> (CreateInitEventHandler. C:356)
Debug Jan 11 17:30:26.12199 The process is going down with warnings
Debug Jan 11 17:30:26.148199 Outgoing XML: <xml version "1.0" encoding ="UTF-8"?>
<Alert trigger = "true" >
<Alerttype>orderheld</Alerttype>
<AlertID>mGMjhgHgffHhhFdH1u4</AlertID>
<Order>uwiofhdf</Order>
<Quantity>7651</Quanity>
</Alert>(CreateEventHandler. C:723)
Debug Jan 11 17:30:26.13214 The process has restarted and thread opened
Debug Jan 11 17:30:26.13215 The heartbeat is recieved from alertlistener process

Agora, o requisito é usar o AlertID na entrada, verificar o log do processo e extrair o XML de saída correspondente em um arquivo separado.

Usando o awk, consigo extrair todos os arquivos xml de saída, mas não sei como extrair aquele relacionado a um AlertID específico.

Além disso, não consigo instalar / usar qualquer analisador XML novo de acordo com a política da empresa. Isso precisa ser alcançado usando shell / perl / awk / sed

Por exemplo:

awk '/Outgoing/{p=1; s=$0} P & & /<\/Alert>/ {print $0 FS s; s="" ;p=0}p' 1.log>2.log
    
por abhishek chaudhry 15.01.2018 / 17:01

2 respostas

0

Suponha que seu ID seja fornecido em uma variável chamada ALERTID :

sed -e '/Outgoing XML/!d;:a' -e '$d;N;s/.*\(<xml version.*<\/Alert>\).*//;Ta' -e "/$ALERTID/!d" yourfile.log

Explicação:

  • /Outgoing XML/!d;:a deletar coisas até a linha Outgoing XML e iniciar um loop então
  • $d para excluir um registro inacabado no final do arquivo
  • N;s/.*\(<xml version.*<\/Alert>\).*//;Ta acrescenta linhas até a tag </Alert> ser encontrada e remove tudo antes e depois do bloco desejado "/ $ ALERTID /! d deletes blocks without the $ ALERTID '

Talvez seja melhor ler:

sed '/Outgoing XML/!d;:a
     $d;N
     s/.*\(<xml version.*<\/Alert>\).*//;Ta
     /'$ALERTID'/!d' yourfile.log
    
por 15.01.2018 / 18:13
0

crie um script de shell, getalert.sh, com o seguinte conteúdo:

awk '
/^Debug .* Outgoing XML/{
  sub(/^.* Outgoing XML: /,"")
  H=$0
  LC=0
  next
}
/<\/Alert>/ {
  sub(/Alert>.*$/,"Alert>")
  if (LC>0) {print}
  LC=0
  next
}

/<AlertID>'$1'<\/AlertID>/{
  print H
  print
  LC=1
  next
}

/<AlertID>.*<\/AlertID>/{
  H=""
  LC=0
  next
}

{ if (LC > 0) {
    print
  } else {
    H = H $0
  }
}' $2

execute como

getalert.sh mGMjhgHgffHhhFdH1u4 process.log
    
por 15.01.2018 / 17:51

Tags