Разобрать логи Apache для конкретного слова за последний час

Я смотрю, чтобы разобрать мой /var/log/httpd папка, которая содержит много файлов журнала Apache.

Я ищу конкретные события в течение последнего часа. Я пробовал ниже, но мне не повезло.

grep -R "$(date -d -1hour +'%Y-%m-%d %H')" /var/log/httpd/ | grep "too many failed"

Мысли?

2 ответа

Решение

Вы делаете рекурсивный 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 не было бы совпадения строк.

Вы смотрели формат дат в логах apache? В системах, которые я должен передать (CentOS), у которых есть свои журналы доступа в /var/log/httpd формат даты

15/Jun/2014:11:48:27 +0000

Если у вас то же самое, то вам нужно

date -d -1hour +'%d/%b/%Y:%H'

как ваша команда даты

Если это не так, вам нужно показать нам формат, который использует файл журнала.

Другие вопросы по тегам