Я использую приведенный ниже код для непрерывного чтения из файла. Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я запускаю код, он начинается с начала файла, возвращая весь файл, а не с последних 50 строк.
Я ознакомился с документацией и попробовал разные значения аргумента Tail=>n - даже n=total строк в файле минус 50 - однако мой код каждый раз начинается в начале файла, а не в конце, как я нуждаться. Что я делаю не так?
use strict;
use warnings;
use File::Tail;
my $name; #file name
my $name = "/home/richard/double-take/messages.log";
my $line;
my $file=File::Tail->new(name=>$name, interval=>3, maxinterval=>3, tail=>50);
while (defined($line=$file->read)) {
print "$line";
}
Я только что попробовал так, как у вас (без интервала => 3, maxinterval => 3), и теперь это работает.
Очевидно, это вызвано аргументом maxinterval. Когда я добавляю этот аргумент обратно, он возвращает весь файл.
Вы не совсем точно описали, что происходит. На самом деле происходит то, что последние 50 строк отображаются по желанию. Но через 30 секунд он отображает весь файл. Это происходит независимо от того, установили вы maxinterval
или нет. Если вы этого не сделаете, это займет больше времени. В частности, через несколько секунд требуется resetafter
, по умолчанию это adjustafter*maxinterval
, а adjustafter
по умолчанию — 10
.
Кажется, без tail
ничего не получится, так что, похоже, это ошибка.
Если вы говорите, что это произойдет независимо от того, установил я maxinterval
или нет, то как предотвратить это?
Как я уже сказал, возможно, это ошибка. Поэтому общение с автором было бы хорошим началом.
Интересно, это та же самая ошибка, что и вот эта, у которой есть патч
Да, установка этого патча устранила проблему.
Автор File::Tail здесь.
File::Tail
пытается действовать умно, когда файл, который он читает, не обновлялся какое-то время, он проверяет его через все более и более длинные интервалы (настраивается с помощью maxinterval), потому что нет смысла выполнять ожидание занятости для файла, который не обновляется написано. После ожидания настройкой после * maxinterval File::Tail решает, что файл, возможно, был вывернут из-под него. (Вы также можете изменить это с помощью параметра resetafter).
Многие файлы журналов, которые читают пользователи File::Tail, настроены на ротацию тем или иным способом. Некоторые выполняют ротацию, закрывая файл, переименовывая его, а затем записывая в новый файл с исходным именем. Чтобы справиться с этим, через заданный интервал File::Tail пытается повторно открыть файл.
Вопрос в том, когда он повторно открывает файл, откуда он должен его читать? В большинстве распространенных случаев использования требуется разная обработка при повторном открытии файла, а не при первом открытии. Итак, у File::Tail есть специальный параметр, определяющий, как он должен обрабатывать файл после повторного открытия, он называется reset_tail.
По умолчанию для него установлено значение -1 (дайте мне весь файл), поскольку это наиболее распространенный вариант использования, например: «Я читаю и анализирую этот файл, поэтому после поворота я хочу увидеть все строки, которые я пропустил, пока просматривал старый файл». Но если вы не хотите видеть весь файл после повторного открытия, просто установите для параметра reset_tail значение 0 или положительное целое число.
Я не могу комментировать исправление, предложенное Икегами, прошло много лет с тех пор, как я написал этот код, и мне нужно просмотреть его и перепроверить, прежде чем я смогу с уверенностью сказать, что оно соответствует остальному коду.
Я постараюсь выпустить новую версию с еще большим количеством исправлений в документации, предупреждающих вас о различных параметрах, которые вы можете настроить, и, возможно, с добавленным параметром «игнорировать тот же индекс», на случай, если инженер, использующий File::Tail, уверен в себе. рассматриваемый файл будет повернут, а не просто перезаписан.
Спасибо, что написали модуль. Я использую его для наблюдения за своим двориком на предмет обнаружения неопознанных людей из моего стека Fridgate->Double-take->Compreface
, поэтому это помогает обеспечить безопасность для меня и семьи.
Файл::Tail обновлен. (1,3)