Como converter um fuso horário em logs enquanto eles estão sendo seguidos

4

Eu gostaria de manipular o formato de um datestamp de um log, em tempo real, conforme ele está sendo seguido. O formato atual é 2016-04-06T23:19:20.878Z . Eu gostaria de convertê-lo para o nosso fuso horário local e, potencialmente, remover os milissegundos. Posso canalizar a saída de tail -f para algo como awk ou sed , para que isso possa ser feito em tempo real com o restante da saída inalterada?

    
por emkman 07.04.2016 / 03:22

1 resposta

2

Se você sabe em qual campo o timestamp está, por exemplo, a segunda palavra, você pode usar o awk para fazer a conversão fazendo com que ele chame date :

stdbuf -oL tail -f ... |
awk -v timefield=2 '{
  if($timefield ~ /[0-9].*Z/){
    "date --date \"" $timefield "\"" | getline tod
     sub($timefield,tod,$0)
  }
  print 
}'

Você pode precisar obter o tail para não armazenar em buffer no pipe, conforme mostrado acima com stdbuf -oL . Se você não conhece o campo ou se ele se move, pode tentar corresponder ao padrão de fuso horário em cada palavra:

awk  '{
  for(timefield = 1;timefield<=NF;timefield++)
    if($timefield ~ /^[0-9].*T.*Z$/){
      "date --date \"" $timefield "\"" | getline tod
      sub($timefield,tod,$0)
    }
   print 
}'

Isso pressupõe que seu timestamp seja separado por espaço em branco.

Usando seu exemplo nos comentários de I2016-04-08T00:34:29.372Z]v3087 , você pode extrair o registro de data e hora usando o substr(string,offset,length) do awk, pois ele tem comprimento e deslocamento constantes: datestamp = substr($timefield, 2, 24) . Se você não quiser preservar o I inicial e o código à direita na saída resultante, você acabará com:

awk -v timefield=1 '{
  if($timefield ~ /[0-9].*Z/){
     datestamp = substr($timefield, 2, 24)
    "date --date \"" datestamp "\"" | getline tod
     sub($timefield,tod,$0)
  }
  print 
}'

Se você quiser manter o código extra, altere o sub para substituir a sequência de registro de data e data em vez do campo inteiro, por exemplo, com espaços extras: sub(datestamp," " tod " ",$0) .

    
por 07.04.2016 / 17:33

Tags