quarta-feira, 13 de janeiro de 2010

Dica Linux: Convertendo timestamp do log do squid

Quem já se aventurou em visualizar o log de acesso do squid (/var/log/squid/access.log em distribuições Red Hat like) sabe que a primeira coluna é o horário de acesso, vejam o exemplo, só com os primeiros campos de um registro do log:

1263314279.013 671 192.168.1.195 TCP_MISS/200 ...

Aí vem a pergunta: como eu sei que data/horário foi feito esse acesso, em linguagem mais acessível?

Esse formato é o timestamp unix que é simplesmente um contador que teve seu valor zero associado com a data 01/01/1970 00:00:00UTC, e que é incrementado a cada segundo. Quem viveu o bug do milênio, vai se deparar com algo parecido em 2038, pois esse formato trata-se de um inteiro sinalizado de 32 bits (signed int32), que atingirá seu limite no ano citado. Após isso, o calendário voltaria para 13/12/1901 20:45:52 UTC (uau!). A solução seria portar as aplicações para utilizar um inteiro sinalizado de 64 bits (signed int64) o que dá uma folga de uns 290 bilhões de anos! :D

Voltando ao nosso assunto, para fazer uma conversão durante a leitura dos logs, podemos utilizar um simples script em perl que é descrito abaixo:

#!/usr/bin/perl -p
s/^\d+\.\d+/localtime $&/e;

Salve o arquivo, dê permissão de execução ao script (que eu chamei de timeconvert.pl)

chmod +x timeconvert.pl

Agora redirecione a saída do log para este script, da seguinte forma (estou assumindo que o script está no seu diretório atual, caso contrário, especifique o caminho completo):

cat /var/log/squid/access.log | ./timeconvert.pl

A saída deverá ser a seguinte:

Tue Jan 12 11:37:59 2010 671 192.168.1.195 TCP_MISS/200 ...

Com certeza, muito melhor de visualizar e analisar.

Mais informações:

http://pt.wikipedia.org/wiki/Era_Unix

http://en.wikipedia.org/wiki/Unix_time