Лучший способ заменить метку времени на дату при чтении журнала Squid
Сегодня вечером я пытался посмотреть на линии моего прокси, и я придумал это, что кажется почти KISS. Как бы вы сделали это просто?
awk '{ trunc=sprintf("%.0f", $1) ;$1="" ; system("echo -n `date +%R -d\"@" trunc "\" `") ; print $0 ;}' </var/log/squid3/access.log
Линии там начинаются с: 137816847.548
(отсюда разделение пробелом следующего поля, число здесь совершенно случайное)
4 ответа
Вот небольшой скрипт на 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 ...
С кошачьим каналом Perl:
cat access.log | perl -p -e 's/^([0-9]*)/"[".localtime($1)."]"/e'
или чистый перл:
perl -pe 's/\d+/localtime($&)/e' access.log
Добавьте logformat squid с параметрами в /etc/squid/squid.conf, см. Справочную страницу.
Например я использую:
logformat squid %tl IP:%>a %ru err_code
Важным является%tl, что означает создание метки времени по местному времени.
Предполагая, что файл журнала выглядит примерно так:
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