读取 squid 日志时用日期替换时间戳的更好方法

读取 squid 日志时用日期替换时间戳的更好方法

今晚我试着查看我的代理线路,然后我想出了这个,这似乎完全不符合 KISS 的要求。您如何简单地做到这一点?

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

其中的行以 : 开头137816847.548(因此空格分隔下一个字段,这里的数字完全是随机的)

答案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 ...

答案2

使用 cat pipe perl:

cat access.log | perl -p -e 's/^([0-9]*)/"[".localtime($1)."]"/e'

或纯 perl:

perl -pe 's/\d+/localtime($&)/e' access.log

答案3

假设日志文件是这样的:

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

答案4

将带有参数的 logformat squid 添加至 /etc/squid/squid.conf,请参阅手册页

例如我使用:

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

重要的是%tl,意思是以当地时间制作时间戳。

相关内容