Сегодня вечером я пытался посмотреть на линии моего прокси, и я придумал это, которое кажется почти KISS. Как бы вы сделали это просто?

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

Строки там начинаются с: 137816847.548 (отсюда пробел, разделяющий следующее поле, здесь число совершенно случайное)

3 ответа3

1

Вот небольшой скрипт на python, который должен быть достаточно надежным и легко расширяемым:

#!/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()

Сохраните его в файл, такой как parse_squid_log и убедитесь, что он является исполняемым файлом chmod +x parse_squid_log и находится на вашем path .

Использование:

$ 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 ...
1

Предполагая, что файл журнала выглядит примерно так:

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

Распределение команд:

  • команда date установленная для преобразования времени эпохи в 24-часовые часы и минуты
  • установить переменную cmd для желаемой даты команды
  • выполнить cmd и передать в переменную timestamp
  • close системный вывод
  • установите столбец 1 пустым (чтобы избежать дублирования)
  • вывести конвертированное время и остальные столбцы

ИЛИ ЖЕ

Еще лучше только с awk:

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

1

Добавьте logformat squid с параметрами в /etc/squid/squid.conf, см. Справочную страницу.

Например я использую:

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

Важным является% tl, что означает создание метки времени по местному времени.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .