大家好,我对 grep 等工具还不太熟悉。在提出问题之前,我确实阅读了手册页并在互联网上搜索过。我的服务器运行在一系列反向代理服务器后面。一个应用程序给我带来了问题,我必须分析标头响应,所有这些服务器都可以在 SSH 控制台上访问,所以我决定阅读 Apache 日志,我的问题是我想要一个脚本,它可以从 Apache 读取日志的所需部分并告诉我确切的事情。我必须在很多地方这样做,所以工作变得很困难。这是我的一个示例日志
192.168.1.1 - - [18/Nov/2010:15:24:53 +0530] "GET /appl/pix/i/restore.gif HTTP/1.1" 304 187 "http://somedomain/appl/course/view.php?id=2" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; InfoPath.2)"
192.168.1.1 - - [18/Nov/2010:15:24:53 +0530] "GET /appl/pix/i/group.gif HTTP/1.1" 304 187 "http://somedomain/appl/course/view.php?id=2" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; InfoPath.2)"
192.168.1.1 - - [18/Nov/2010:15:24:53 +0530] "GET /appl/pix/i/return.gif HTTP/1.1" 304 188 "http://somedomain/appl/course/view.php?id=2" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; InfoPath.2)"
192.168.1.1 - - [18/Nov/2010:15:24:53 +0530] "GET /appl/pix/i/stats.gif HTTP/1.1" 304 187 "http://somedomain/appl/course/view.php?id=2" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; InfoPath.2)"
192.168.1.1 - - [18/Nov/2010:15:24:53 +0530] "GET /appl/pix/i/questions.gif HTTP/1.1" 304 187 "http://somedomain/appl/course/view.php?id=2" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; InfoPath.2)"
192.168.1.1 - - [18/Nov/2010:15:24:53 +0530] "GET /appl/pix/i/files.gif HTTP/1.1" 304 187 "http://somedomain/appl/course/view.php?id=2" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; InfoPath.2)"
192.168.1.1 - - [18/Nov/2010:15:24:53 +0530] "GET /appl/pix/i/user.gif HTTP/1.1" 304 187 "http://somedomain/appl/course/view.php?id=2" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; InfoPath.2)"
192.168.1.1 - - [18/Nov/2010:15:24:53 +0530] "GET /appl/pix/i/course.gif HTTP/1.1" 304 187 "http://somedomain/appl/course/view.php?id=2" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; InfoPath.2)"
192.168.1.1 - - [18/Nov/2010:15:24:53 +0530] "GET /appl/pix/t/groupn.gif HTTP/1.1" 304 187 "http://somedomain/appl/course/view.php?id=2" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; InfoPath.2)"
我想要一些东西可以根据日期:时间从日志中取出相关的行,那么我如何对其进行 grep,在这种情况下有没有人有什么简单的建议,日志文件非常大,我只需要获取那些基于时间戳(可以是用户范围)的响应,这会出现错误。
答案1
除了学习如何使用软件工具之外,我还建议学习如何给句子加标点。
我只需要获取基于时间戳(可以是用户范围)的那些出现错误的响应
但是您提供的日志样本不包含 HTTP 状态代码 - 这是来自错误日志吗?如果不是,那么您需要将日志格式更改为更具信息量的格式。
'grep' 在不同的实现中有所不同(您没有说在什么操作系统上运行它),但它几乎普遍不提供有限状态机的实现 - 如果您不能将时间范围表示为单个正则表达式(这是 Arenstar 的解决方案的工作方式),那么您将需要它。
如果是我的话,我会使用 awk - 类似于:
cat logfiles | awk 'BEGIN { output=0; }
/\[18\/Nov\/2010:15/ {
output=1;
}
/\[19\/Nov\/2010:02/ {
output=0;
exit 0; # ... if no further blocks to be extracted
}
{ if (output) print $0; }'
这将返回 18 日下午 3 点至 19 日凌晨 2 点之间的所有日志条目。
反向代理服务器链后面
呃,真的吗?
答案2
cat apachelog | grep '[18/Nov/2010:15:24'
应该可以。只需随意更改日期/时间即可
答案3
查看我编写的 Python 脚本。我根据时间范围打印日志条目。由于它是为 syslog 日志文件编写的,因此需要对其进行调整才能与 Apache 日志配合使用。