我正在运行的服务中有多个 2-8 GB 的日志文件。通常,这些日志文件比这个要小(大约 50-250 MB)。
我想对它们进行分析和总结,以找出到底发生了什么事情。
是否有任何工具可以帮助实现自动化,或者至少提供初步的帮助?我正在考虑使用 head、awk、cut、grep 等,但这些工具的自动化程度不高。
答案1
我发现grep
,、、、、和cut
的sort
组合对于临时的一次性日志检查很有帮助。uniq
head
tail
检查日志文件的顶部
看起来每行都以日期/时间开头。
$ head porter10.log
03/10/2011 12:14:25 -------- (Port Control [Version 5.2 (Milestone 4)]) --------
03/10/2011 12:14:25 -------- LOG BEGINS --------
03/10/2011 12:14:25 Common DLL [Version 5.2 (Milestone 4)] [Version Details: 5.2.4]
03/10/2011 12:14:25 Message DLL [Version 5.2 (Milestone 4)] [Version Details: 5.2.4]
删除时间戳
我使用该cut
命令,告诉它保留字段 3 及以上,并使用空格作为分隔符。
$ cut -f3- -d' ' porter10.log | head
-------- (Port Control [Version 5.2 (Milestone 4)]) --------
-------- LOG BEGINS --------
Common DLL [Version 5.2 (Milestone 4)] [Version Details: 5.2.4]
Message DLL [Version 5.2 (Milestone 4)] [Version Details: 5.2.4]
修剪到线条不变的部分
我预感到大多数多余的输出行都会有类似的文本,所以我将输出修剪为时间戳后的前 20 个字符。
$ cut -f3- -d' ' porter10.log | cut -b-20 | head
-------- (Port Cont
-------- LOG BEGINS
Common DLL [Version
Message DLL [Version
Protocol DLL [Versio
排序并找出最大计数
然后,我进行排序、计数,再对计数进行排序,以找出哪些行出现得最频繁。
看来我幼稚的时间戳删除技术删掉了几行有用的(非时间戳)信息,只留下了一些空洞的数字。
不过,它们似乎都以相同的频率出现,而且比其他任何事情都多一个数量级,所以我找到了我的嫌疑人。
20 个字符的范围是一种直觉,而不是硬性规定。您可能需要多次运行此步骤才能找到区分不寻常行的最佳点。
$ cut -f3- -d' ' porter10.log | cut -b-20 | sort | uniq -c | sort -n
13827 Error (266) to Remot
13842 Error decode for dev
17070 Error Writing to Ret
46506 **** Checkpoint ****
181820 (65)
181820 (67)
181821 (111)
181821 (1555)
181821 (55)
181821 (66)
181821 (77)
181980 (107)
根据上下文搜索候选人
grep
所以,现在我有了一个潜在候选人的列表,我可以使用上下文和-C#
上下文行选项在上下文中寻找他们:
$ grep -C3'(1555)'porter10.log|head 2011/03/10 12:14:25.455 正在查找 DLC 设备 / 开始 解码 tbl_pao_lite.cpp (107) 解码 tbl_base.cpp (111) 解码 dev_single.cpp (1555) 解码 dev_dlcbase.cpp (77) 解码 tbl_carrier.cpp (55) 解码 tbl_route.cpp (66) -- 解码 tbl_loadprofile.cpp (67) 解码 tbl_pao_lite.cpp (107)
蒙特卡罗方法 - 检查日志文件的中间部分
如果上述方法不起作用,请尝试查看文件中的不同位置。
看起来这个文件大约有 160 万行,所以我查看了第 80 万行。
这证实了我的排序和计数方法的结果。
$ wc -l porter10.log 1638656 porter10.log $ head -800000 porter10.log|tail 解码 dev_dlcbase.cpp (77) 解码 tbl_carrier.cpp (55) 解码 tbl_route.cpp (66) 解码 dev_carrier.cpp (65)
成功!
在这种情况下,输出是由于我们的配置文件中留下了一些多余的调试日志。
您需要调整此方法以适合您的特定日志文件,但主要关键是:
- 删除时间戳
- 修剪到一定程度的线,这些线很可能不会改变
- 排序并计算剩余的
- 在上下文中搜索最大的罪魁祸首
答案2
你尝试过 Splunk 吗?http://www.splunk.com/
答案3
如果你想在成长过程中分析你的文件,你可以得到很好的结果日志顶部:
请求最多的 IP :
tail -f /var/log/apache2/access.log | cut -d' ' -f1 | logtop
请求最多的 URL(如果 URL 的第 7 个字段是您的文件?)
tail -f /var/log/apache2/access.log | cut -d' ' -f7 | logtop