парсинг лога по времени.

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Ответить
Аватара пользователя
bars
Сообщения: 930
ОС: BSD/LINUX
Контактная информация:

парсинг лога по времени.

Сообщение bars »

Привет.
Решил по интересоваться, кто как ищет данные в логе за определенный промежуток времени?
К примеру лог nginx

Код: Выделить всё

ip_adress - - [25/Nov/2021:16:27:12 +0300]
Как то грамоско и неуклюже получилось у меня команда поиска с 6 утра и по 15.00.

Код: Выделить всё

egrep '25/Nov/2021:(06|07|08|09|10|11|12|13|14|15)'
egrep '25/Nov/2021:(0[6-9]|1[0-5])'
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 930
ОС: BSD/LINUX
Контактная информация:

Re: парсинг лога по времени.

Сообщение bars »

Попробовал сделать такой, от и до.

Код: Выделить всё

awk '$4 >= "[25/Nov/2021:13:30" && $4 < "[25/Nov/2021:13:49"'
Работает.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: парсинг лога по времени.

Сообщение olecya »

Формат лога только одна строчка с временной меткой? Или это только заголовок и есть тело лога?
bars писал:
25.11.2021 16:49
$4 >= "25/Nov/2021:13:30" && $4 < "25/Nov/2021:13:49"
Вы не можете сравнивать так названия месяцев, только их цифровое обозначение и порядок следования должен быть следующим:
"год месяц день час минута секунда" обязательно двумя цифрами, то-есть с предшествующим нулем если одна цифра.
Можно определить переменную FS по другому. Например:

Код: Выделить всё

awk -F'[[/ :]+' '{print  $6,$5,$4,$7,$8,$9}' log
Получим:

Код: Выделить всё

2021 Nov 25 16 27 12
Остается только конвертировать через встроенную функцию strftime и mktime или создать массив конкретно для месяцев года. Я так понимаю локаль русская и awk из freebsd?
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 930
ОС: BSD/LINUX
Контактная информация:

Re: парсинг лога по времени.

Сообщение bars »

olecya писала:
25.11.2021 18:39
Формат лога только одна строчка с временной меткой? Или это только заголовок и есть тело лога?
Начало строки лога nginx.
Стандартный лог access nginx.
Вы еще больше усложнили решение. )
Эта команда должна быть более простой, так как часто пользуешься ей.
В принципе понял почему без квадратной скобки не работало.

Код: Выделить всё

awk '$4 >= "[25/Nov/2021:13:30" && $4 < "[25/Nov/2021:13:49"'
Работает хорошо.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: парсинг лога по времени.

Сообщение olecya »

Ну так дело не в усложнении, а в универсальности. У вас что логи отдельные на каждый месяц? Представьте например последний день месяца. Как вы разберетесь с таким переходом в который попадает искомый интервал? Оставлю на всякий случай, вдруг заинтересуетесь

Код: Выделить всё

#!/bin/sh

#      y    m  d  h  m  s
start="2021 01 31 00 00 00"
  end="2021 02 02 00 00 00"

awk -F'[[/ :]+'  -v start="$start" -v end="$end" \
	-v mon="$(LC_ALL=C locale abmon)" '
BEGIN   {for(n=split(mon, M, ";"); n; n--)
                nM[M[n]] = sprintf("%02d", n)}
        {line = $6" "nM[$5]" "$4" "$7" "$8" "$9}
line >= start &&
        line < end {print}
' log
Последний раз редактировалось olecya 25.11.2021 20:52, всего редактировалось 1 раз.
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 930
ОС: BSD/LINUX
Контактная информация:

Re: парсинг лога по времени.

Сообщение bars »

olecya писала:
25.11.2021 19:39
Ну так дело не в усложнении, а в универсальности. У вас что логи отдельные на каждый месяц?
Неее, логи обычно парсят по ситуации.
К примеру если нужно найти действие в определенном периоде.
Спасибо за пример, чуть позже его разберу, посмотрю.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: парсинг лога по времени.

Сообщение olecya »

Можно даже убрать последнее {print} само условие будет играть роль true или false в конце скрипта
bars писал:
25.11.2021 19:58
чуть позже его разберу, посмотрю.
Рада буду объяснить если вдруг что не поймете
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: парсинг лога по времени.

Сообщение Bizdelnick »

Задайте формат лога, который Вам будет удобно парсить, и не мучайтесь.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 930
ОС: BSD/LINUX
Контактная информация:

Re: парсинг лога по времени.

Сообщение bars »

Bizdelnick писал:
25.11.2021 21:08
Задайте формат лога, который Вам будет удобно парсить, и не мучайтесь.
Не понял.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: парсинг лога по времени.

Сообщение Bizdelnick »

bars писал:
26.11.2021 09:35
Bizdelnick писал:
25.11.2021 21:08
Задайте формат лога, который Вам будет удобно парсить, и не мучайтесь.
Не понял.
https://nginx.org/ru/docs/http/ngx_http_log_module.html#log_format
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 930
ОС: BSD/LINUX
Контактная информация:

Re: парсинг лога по времени.

Сообщение bars »

Не то.
Сам лог log_format настроен и парой для некоторых проектов достаточно стандартных настроек log.
Мне нужно по временному интервалу иногда просматривать логи.
В принципе этого варианта достаточно.
awk '$4 >= "[25/Nov/2021:13:30" && $4 < "[25/Nov/2021:13:49"'
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: парсинг лога по времени.

Сообщение Bizdelnick »

bars писал:
26.11.2021 12:31
Сам лог log_format настроен и парой для некоторых проектов достаточно стандартных настроек log.
Мне нужно по временному интервалу иногда просматривать логи.
Так блин, поменяйте формат даты хотя бы с $time_local на $time_iso8601, и будет Вам счастье.
Добавлено (12:56):
Хотя, конечно, правильнее было бы прикрутить что-нибудь типа Loki, но если так хочется страданий с grep/awk…
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: парсинг лога по времени.

Сообщение SLEDopit »

bars писал:
25.11.2021 16:30
Решил по интересоваться, кто как ищет данные в логе за определенный промежуток времени?
Сливаю логи в loki (или ELK). Там гораздо удобнее и искать по логам, и анализировать.
Конечно, если есть только локалхост, то большого смысла в этом нет, а если хотя бы несколько машин / приложений, то уже очень удобно.
Добавлено (15:59):
А. собственно, Bizdelnick выше уже порекомендовал. Ну ладно.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 930
ОС: BSD/LINUX
Контактная информация:

Re: парсинг лога по времени.

Сообщение bars »

Нее, loki и подобный софт меня не интересует.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: парсинг лога по времени.

Сообщение olecya »

bars
Значит по достижении критической массы логов вы будете знать о возможной альтернативе и я тоже ;)
Спасибо сказали:
Ответить