今晚我试着查看我的代理线路,然后我想出了这个,这似乎完全不符合 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,意思是以当地时间制作时间戳。