Поиск логов в пределах диапазона дат

Вопрос или проблема

Мой файл журнала выглядит следующим образом:

10.434.22.334 - неаутентифицирован 10/Авг/2020:23:45:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - неаутентифицирован 10/Авг/2020:23:45:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - неаутентифицирован 11/Авг/2020:23:34:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - неаутентифицирован 12/Авг/2020:23:45:43 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - неаутентифицирован 13/Авг/2020:23:43:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - неаутентифицирован 14/Авг/2020:23:33:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74

Я хочу искать указанные выше записи, задав диапазон дат, как ниже:

./Logsearch.sh 10/Авг/2020 13/Авг/2020

Ожидаемый результат:

10.434.22.334 - неаутентифицирован 10/Авг/2020:23:45:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - неаутентифицирован 10/Авг/2020:23:45:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - неаутентифицирован 11/Авг/2020:23:34:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - неаутентифицирован 12/Авг/2020:23:45:43 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - неаутентифицирован 13/Авг/2020:23:43:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74

Как я могу это сделать?


Есть ли идеи, как написать скрипт для моего запроса. Возможно, ОС – Solaris 11. Пожалуйста, предоставьте пример скрипта.

Это выглядит как стандартный журнал доступа HTTP, так почему бы не использовать grep, чтобы сопоставить искомые даты?

$ grep '1[0-3]/Авг/2020' access_log

10.434.22.334 - неаутентифицирован 10/Авг/2020:23:45:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - неаутентифицирован 10/Авг/2020:23:45:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - неаутентифицирован 11/Авг/2020:23:34:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - неаутентифицирован 12/Авг/2020:23:

Ответ или решение

Как выполнять поиск логов по диапазону дат

В данной статье мы рассмотрим, как эффективно искать записи в логах по заданному диапазону дат, используя предоставленный вами формат лог-файлов. Лог-файл содержит записи в формате, где каждая строка начинается с IP-адреса, затем идет информация о времени запроса, методе, URL, статусе ответа и размере.

Пример лог-файла:

10.434.22.334 - unauthenticated 10/Aug/2020:23:45:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 10/Aug/2020:23:45:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 11/Aug/2020:23:34:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 12/Aug/2020:23:45:43 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 13/Aug/2020:23:43:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74
10.434.22.334 - unauthenticated 14/Aug/2020:23:33:45 +0800 "GET /eai/random.jsp HTTP/1.1" 200 74

Задача

Мы хотим отфильтровать записи из логов, чтобы получить данные, которые попадают в заданный диапазон дат, например, с 10 Авг 2020 по 13 Авг 2020.

Использование командной строки и утилит

Для выполнения этой задачи на операционной системе Solaris 11, вы можете использовать такие инструменты, как grep, awk, или специализированные скрипты на языках программирования, таких как Perl или Raku.

1. Использование grep

Чтобы быстро отфильтровать записи между определёнными датами, используйте следующую команду:

grep '1[0-3]/Aug/2020' access_log

Эта команда найдет строки, в которых дата находится между 10 и 13 августом 2020 года. Условие 1[0-3] обозначает числа от 10 до 13.

2. Использование awk

Для более сложной фильтрации можно использовать awk:

awk -v start="10/Aug/2020" -v end="13/Aug/2020" '{split($4, d, ":"); if (d[1] >= start && d[1] <= end) print $0}' access_log

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

3. Использование Perl и модуля Time::Piece

Пример использования Perl для более точной фильтрации:

perl -MTime::Piece -sne '
    BEGIN {
        our $since = Time::Piece->strptime($since, "%d/%b/%Y")->epoch;
        our $until = Time::Piece->strptime($until, "%d/%b/%Y")->epoch;
    }
    if (m!(\d{2}/(?:Aug)/\d{4}:\d{2}:\d{2}:\d{2})\s([+-]\d{4})!) {
        my $d = Time::Piece->strptime("$1 $2", "%d/%b/%Y:%H:%M:%S %z")->epoch;
        if ($d >= $since && $d <= $until) {
            print;
        }
    }
' -- -since=10/Aug/2020 -until=13/Aug/2020 access_log

Этот скрипт использует библиотеку Time::Piece, чтобы более удобно работать с датами и проводить фильтрацию по диапазону.

Заключение

Существует множество способов поиска и фильтрации логов по диапазону дат. В зависимости от ваших нужд и навыков можно использовать простые инструменты командной строки или более сложные скрипты на Perl. Важно понимать, что правильный выбор метода может значительным образом повлиять на эффективность и удобство работы с логами.

Таким образом, вы сможете легко находить информацию, соответствующую вашим требованиям, в большом объеме логов.

Оцените материал
Добавить комментарий

Капча загружается...