Intereting Posts
Замена слов специальным символом в файле Повторно активировать сохраненный pid окна с помощью xdotool Creative CA0132 нет звука rsync Передача агента SSH через 3 удаленные системы не работает с одной командой Перечисление \ запись файлов в определенном каталоге вызывает команду Почему я вижу «Не удалось найти tools.jar. Ожидалось найти его в … », когда я запускаю ant (на RHEL 6.6), даже если путь установлен sshfs всегда запрашивает пароль в fstab? Переменная, связанная с переменной Как вы можете группировать символические ссылки с каталогами в выводе `ls`, но сказать разницу? Случайно отформатированный раздел Ubuntu для NTFS. Восстановление? Экономически выгодно спаривать каждую строку файла со всеми остальными «Bind: Address уже используется» при создании моста в Linux для Windows Что не так с моей командой копирования? Что решает, когда cron.hourly работает? Пинг пропускает правила iptables / postrouting

Извлечение 2 дат из файла журнала с конкретными шаблонами и сравнение 2 дат

Кажется, у меня есть проблемы с моим инструментом пула соединений. При получении соединения с БД возникает большая задержка.
Я пытаюсь получить все случаи из файла журнала, когда происходит этот инцидент

Связанные записи журнала выглядят как

... 2018-03-12 16:18:44,070 efault task-166 gine.jdbc.internal.LogicalConnectionImpl DEBUG Obtaining JDBC connection ... 2018-03-12 16:20:23,172 efault task-166 gine.jdbc.internal.LogicalConnectionImpl DEBUG Obtained JDBC connection ... 

Таким образом, если шаблон « Отладка получения JDBC-соединения » имеет место, извлеките дату « 2018-03-12 16: 18: 44,070 », а когда шаблон « DEBUG-получено JDBC-соединение » найден, извлеките его дату и сравните 2 даты. Если разница составляет более 2 секунд, войдите в систему.

Я знаю, что это довольно сложно решить с помощью одной строки кода, но возможно ли без написания программы сделать это?

Я хотел бы подойти к нему с помощью сценария awk ниже. Скрипт ищет строки «получение» и «получение». Типичным случаем является то, что он сначала находит строку «получения», а затем «полученную» строку; если «найденная» строка будет найдена первой, d1 будет не установлена ​​или равна нулю, поэтому о ней не будет сообщено. В противном случае мы извлекаем основную часть даты (перед запятой), преобразуем ее в секунды с начала эпохи, а затем добавляем миллисекунды. Это значение сохраняется в d1 .

Как только «полученная» строка увидена, ее дата вычисляется таким же образом, тогда мы проверяем разницу; если прошло более 2 секунд, мы сообщаем об этом. В любом случае, мы затем сбрасываем d1 чтобы начать процесс заново.

Сохраните нижеприведенное в сценарий, назвав его как угодно (например, alert-jdbc.awk ), затем запустите его с помощью awk -f alert-jdbc.awk < log-file-here .

Сценарий требует утилиту даты GNU для преобразования произвольных дат.

 /DEBUG Obtaining JDBC connection/ { split($1 " " $2, dates, /,/) "date -d \"" dates[1]"\" +%s" | getline seconds d1=seconds + dates[2]/1000 } /DEBUG Obtained JDBC connection/ { if (d1) { split($1 " " $2, dates, /,/) "date -d \"" dates[1]"\" +%s" | getline seconds d2=seconds + dates[2]/1000 if (d2 - d1 > 2) { print "More than 2 seconds for: " $0 } d1=0 } } 

Попробуй это:

 Delay=$(( ($(date -d "`awk '/DEBUG Obtained JDBC connection/{print $1" "$2}' file.log | cut -d ',' -f1 | tail -n1`" +%s)) - ($(date -d "`awk '/DEBUG Obtaining JDBC connection/{print $1" "$2}' file.log | cut -d ',' -f1 | tail -n1`" +%s)) )) echo "$Delay Sec" 

объяснит команду, если она работает по вашему требованию.