Мне бы хотелось, чтобы мой скрипт Perl разбирался в syslogs.Perl scripting для syslog
Мой скрипт запускается на cron на почасовой основе для вывода некоторых статистических данных. Я заметил, что это занимает почти 5-10 минут, чтобы закончить в течение дня (syslogs архивируются ежедневно), так как файлы системного журнала несколько ГБ и сценарий делает простой:
open LOG, $logfile or die "fatal error. Could not open $logfile"
Проблема заключается в том, что изначально первые журналы журналов - первые строки в журналах. По мере того как день прогрессирует, «текущий час» записей журнала в syslog теперь, скажем, от 600000 до 700000. Таким образом, каждый час он становится медленнее и медленнее.
Сложный подход состоял бы в том, чтобы выполнить grep-файл против файла на основе времени и сохранить результаты в файле tmp, после чего мой скрипт perl обработает файл tmp, а затем удалит файл tmp, повторите.
Есть ли более программный способ гарантировать, что я не перечитываю тысячи строк каждый раз?
SK
Время, необходимое для открытия файла, не зависит от того, насколько оно велико. 5 или 10 минут - это долгое время для поиска даже нескольких гигабайт. Не могли бы вы разместить фактический код поиска? – Schwern
Я добавил печать после 'while () {$ count ++; print line $ count \ n "' и его прирост со скоростью 5000 строк в секунду. Однако к 7-му часу мои текущие часы журналов находятся на линиях 600000-70000. Код довольно длинный, а на поле нет в этой сети так сложно переносить, что и маленький фрагмент. В принципе, я не хочу перечитывать строки 1-600000 за каждый час, когда я проверяю журнал на наличие журналов текущего часа. Надеюсь, это имеет смысл. –
scryptKiddy
Фактический поиск находится прямо после печати выше, в котором говорится: 'if ($ _ = ~/^ $ time_search_str /) {... делать некоторые вещи' – scryptKiddy