我正在解析/var/log/httpd
包含大量 Apache 日志文件的文件夹。
我正在寻找过去一小时内的特定事件。我尝试了以下方法,但没有任何结果。
grep -R "$(date -d -1hour +'%Y-%m-%d %H')" /var/log/httpd/ | grep "too many failed"
有什么想法吗?
答案1
您正在执行递归 grep (-R) - 在这种情况下是无用的 - 我假设您在 /var/log/httpd 下没有任何子目录(如果这是标准发行版)。
您要做的就是丢弃时间戳为一小时前的行之前的所有内容。此外,访问和错误日志中通常包含不同的时间戳。
例如,访问日志具有以下时间戳:
[15/Jun/2014:23:11:41 +0200]
因此您需要使用日期来打印特定时间戳中的时间,例如:
CURTIME=$(date -d -1hour +'%d/%b/%Y:%H:%M' | sed 's#/#.#g'); \
sed "1,/$CURTIME/d" /var/log/httpd/*access_log
对于错误日志,您需要使用不同的方法,因为 error_log 使用这种时间戳:
[Sat Jun 14 09:12:50 2014]
您唯一需要记住的是,如果 apache 一小时前没有记录任何行,则这种方法将会失败,因为 sed 没有行匹配。
答案2
你看过 Apache 日志中日期的格式了吗?在我手头的系统 (CentOS) 中,访问日志的/var/log/httpd
日期格式是
15/Jun/2014:11:48:27 +0000
如果你也是这样,那么你需要
date -d -1hour +'%d/%b/%Y:%H'
作为您的日期命令。
如果不同,那么您需要向我们展示日志文件使用的格式。