Получение Perl File::Tail для начала потоковой передачи файла ближе к концу

Я использую приведенный ниже код для непрерывного чтения из файла. Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я запускаю код, он начинается с начала файла, возвращая весь файл, а не с последних 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";
}

Файл::Tail обновлен. (1,3)

gatorreina 11.04.2024 22:42

Я только что попробовал так, как у вас (без интервала => 3, maxinterval => 3), и теперь это работает.

gatorreina 11.04.2024 22:47

Очевидно, это вызвано аргументом maxinterval. Когда я добавляю этот аргумент обратно, он возвращает весь файл.

gatorreina 11.04.2024 23:00

Вы не совсем точно описали, что происходит. На самом деле происходит то, что последние 50 строк отображаются по желанию. Но через 30 секунд он отображает весь файл. Это происходит независимо от того, установили вы maxinterval или нет. Если вы этого не сделаете, это займет больше времени. В частности, через несколько секунд требуется resetafter, по умолчанию это adjustafter*maxinterval, а adjustafter по умолчанию — 10.

ikegami 12.04.2024 01:42

Кажется, без tail ничего не получится, так что, похоже, это ошибка.

ikegami 12.04.2024 01:48

Если вы говорите, что это произойдет независимо от того, установил я maxinterval или нет, то как предотвратить это?

gatorreina 12.04.2024 02:21

Как я уже сказал, возможно, это ошибка. Поэтому общение с автором было бы хорошим началом.

ikegami 12.04.2024 02:27

Интересно, это та же самая ошибка, что и вот эта, у которой есть патч

ikegami 12.04.2024 02:28

Да, установка этого патча устранила проблему.

ikegami 12.04.2024 05:53
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
83
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Автор 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, поэтому это помогает обеспечить безопасность для меня и семьи.

gatorreina 12.04.2024 15:03

Другие вопросы по теме