汇总庞大的日志文件

汇总庞大的日志文件

我正在运行的服务中有多个 2-8 GB 的日志文件。通常,这些日志文件比这个要小(大约 50-250 MB)。

我想对它们进行分析和总结,以找出到底发生了什么事情。

是否有任何工具可以帮助实现自动化,或者至少提供初步的帮助?我正在考虑使用 head、awk、cut、grep 等,但这些工具的自动化程度不高。

答案1

我发现grep,、、、、和cutsort组合对于临时的一次性日志检查很有帮助。uniqheadtail

检查日志文件的顶部

看起来每行都以日期/时间开头。

$ 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)

成功!

在这种情况下,输出是由于我们的配置文件中留下了一些多余的调试日志。

您需要调整此方法以适合您的特定日志文件,但主要关键是:

  1. 删除时间戳
  2. 修剪到一定程度的线,这些线很可能不会改变
  3. 排序并计算剩余的
  4. 在上下文中搜索最大的罪魁祸首

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

相关内容