Melhor maneira de substituir o timestamp por data ao ler um log do squid

0

Hoje à noite eu estava tentando olhar para as linhas do meu proxie, e eu inventei isso, que parece tudo, menos o KISS. Como você faria isso simplesmente?

 awk '{ trunc=sprintf("%.0f", $1) ;$1="" ; system("echo -n 'date +%R -d\"@" trunc "\" '") ; print $0 ;}' </var/log/squid3/access.log

As linhas lá começam com: 137816847.548 (daí o espaço delimitando próximo campo, número totalmente aleatório aqui)

    
por mveroone 08.08.2013 / 00:47

3 respostas

1

Aqui está um pequeno script python que deve ser bastante robusto e facilmente estendido:

#!/usr/bin/env python

import sys, os
from datetime import datetime

try:
    if not os.path.isfile(sys.argv[1]):
        sys.stderr.write("[Error]: %s is not a file\n" % sys.argv[1])
        sys.exit(1)
except IndexError:
    sys.stderr.write("Usage: parse_squid_log.py access.log\n")
    sys.exit(1)

with open(sys.argv[1]) as log:
    for line in log:
        line = line.split(' ')
        line[0] = str(datetime.fromtimestamp(float(line[0])))
        print ' '.join(line).strip()

Salve-o em um arquivo como parse_squid_log e verifique se ele é executável chmod +x parse_squid_log e path .

Uso:

$ parse_squid_log
Usage: parse_squid_log.py access.log

$ parse_squid_log abc
[Error]: abc is not a file

$ parse_squid_log /var/log/squid3/access.log
2013-07-23 05:19:26.136000      929 185.168.101.131 TCP_MISS/200 28198 ...
2013-07-23 05:23:07.488000      0 10.42.0.14 TCP_IMS_HIT/304 278 GET ...
2014-05-08 13:49:47.488000      0 10.42.0.14 TCP_IMS_HIT/304 278 GET ...
    
por 10.08.2013 / 15:47
1

Assumindo que o arquivo de log é algo como isto:

1374553166.136    929 185.168.101.131 TCP_MISS/200 28198 GET http://www.amazon.de/gp/offer-listing/B000NOIW62/ref=sr_1_1_olp? - DIRECT/178.236.7.219 text/html
1374553387.488      0 10.42.0.14 TCP_IMS_HIT/304 278 GET http://g-ecx.images-amazon.com/images/G/01/da/creatives/sn130.png - NONE/- image/png
1399553387.488      0 10.42.0.14 TCP_IMS_HIT/304 278 GET http://g-ecx.images-amazon.com/images/G/01/da/creatives/sn130.png - NONE/- image/png

awk '{ cmd = ("date +%R -d @"$1); cmd | getline timestamp; close(cmd); $1=""; print timestamp$0 }' /var/log/squid3/access.log

Falha no comando:

  • Comando date definido para converter o horário de data em hora e minuto de 24 horas
  • defina a variável cmd para o comando de data desejada
  • execute o cmd e o pipe na variável timestamp
  • close saída do sistema
  • defina a coluna 1 como em branco (para evitar duplicação)
  • imprima o tempo convertido e o restante das colunas

OR

Melhor ainda com apenas awk:

awk '{timestamp=strftime("%R",$1); $1=""; print timestamp$0}' /var/log/squid3/access.log

    
por 08.08.2013 / 02:53
1

Adicione logformat squid com parâmetros para /etc/squid/squid.conf, veja a página man .

Por exemplo, eu uso:

logformat squid %tl IP:%>a %ru err_code

Importante é% tl, ou seja, fazer registro de data e hora no horário local.

    
por 11.02.2014 / 14:01