2

我有一些不守规矩的 apache 错误日志,我想对其进行解析并获得独特的错误。

[Fri Sep 21 06:54:24 2012] [error] [client xxx.xxx.xxx.xxx ] PHP Fatal error: <error message>, referrer: <url>

我想我只想在“PHP Fatal”部分删减行,丢弃前半部分并通过 uniq 运行后半部分。我的目标是找出所有的错误,但是由于有很多重复的错误,有太多的行需要手动查看。

实现这一目标的最佳方法是什么?

4

4 回答 4

2

尝试grep -o '\[error\].*$' file | sort | uniq

这将仅显示与正则表达式匹配的内容(而不是包含匹配项的整行)。

然后 sort 将相似的条目彼此相邻,以便 uniq 可以确保没有重复项。

如果要在排序 / uniq'ing 之前删除客户端位,请使用 grep -o '\[error\].*$' file | sed 's/\[client.*\?\]//' | sort | uniq

于 2012-09-21T14:36:56.767 回答
2

分析/var/log/apache2/error.log使用

sed 's^\[.*\]^^g' /var/log/apache2/error.log | sort | uniq -c | sort -n

这将

  1. 在每行的开头剪切日期,例如:

    [2012 年 8 月 28 日 11:20:24 UTC] PHP 通知:未定义索引:在线测试 /var/www/...

  2. 计算唯一行

  3. 按出现排序

来源:strictcoder.blogspot.de


如果您创建新日志,您可以预先配置 php:

在 php.ini 中设置或添加到您的 php 脚本中ignore-repeated-errors= Onini_set('ignore-repeated-errors', 1);

这将阻止 php 多次记录错误,即由同一脚本中的同一行引起的错误消息。

来源:php 错误日志,如何删除重复项/查找唯一错误

(但这确实有助于分析现有日志)

于 2013-10-17T09:28:42.570 回答
0

使用 sed:

sed -r 's/(.*)(PHP Fatal error)/\2/' logfile | sort -u
于 2012-09-21T15:07:14.957 回答
0

正则表达式解析字符串可以是ERROR.*(在 regex101.com 上测试)

下面的命令将确保它搜索不区分大小写

grep -ori 'ERROR.*$' filename | sort | uniq
于 2019-07-10T08:59:20.650 回答