Чтение логов по типу tail -f
Цитата: Руслан от 02.11.2022, 13:19Добрый день всем!
Вот я упёрся в проблему которую не могу решить самостоятельно по прошествии недели гугления, проб и ошибок. Прошу помощи.
Перепробовал большое множество вариантов из собственной головы, различных форумов, stackoverflow поэтому не вижу смысла показывать тут кучу кода. До и вообще насколько я понял эта проблема возникает часто и у многих.Условие: Пишется лог файл приложением 10 строк в секунду. Ротация лога при достижении 100Mb
Задача заключается в том чтобы читать логи построчно и никак не оказывать влияния на сам лог файл и не дай боженьки не повлиять на работу приложения которое его пишет. Читать по принципу tail -f myApp.log каждую строчку с определённого номера строки на котором остановились ранее. Чтобы потом отправить результат в хранилище.Можно было бы решить с помощью Powershell но политика запрещает его использовать.
Можно конечно использовать готовые решения типа FileBeat от ELK, но все решения либо импортные, либо не решают поставленную задачу, поэтому делаю своё. =)
Добрый день всем!
Вот я упёрся в проблему которую не могу решить самостоятельно по прошествии недели гугления, проб и ошибок. Прошу помощи.
Перепробовал большое множество вариантов из собственной головы, различных форумов, stackoverflow поэтому не вижу смысла показывать тут кучу кода. До и вообще насколько я понял эта проблема возникает часто и у многих.
Условие: Пишется лог файл приложением 10 строк в секунду. Ротация лога при достижении 100Mb
Задача заключается в том чтобы читать логи построчно и никак не оказывать влияния на сам лог файл и не дай боженьки не повлиять на работу приложения которое его пишет. Читать по принципу tail -f myApp.log каждую строчку с определённого номера строки на котором остановились ранее. Чтобы потом отправить результат в хранилище.
Можно было бы решить с помощью Powershell но политика запрещает его использовать.
Можно конечно использовать готовые решения типа FileBeat от ELK, но все решения либо импортные, либо не решают поставленную задачу, поэтому делаю своё. =)
Цитата: Vladimir от 13.12.2022, 16:58Если еще актуально, это делается через FileSystemWatcher и чтение последней строки. Если страшно за то, что какие-то строки могут быть пропущены, то можно сохранять положение каретки и читать с последнего положения внутри lock или Semaphore(-Slim)
Если еще актуально, это делается через FileSystemWatcher и чтение последней строки. Если страшно за то, что какие-то строки могут быть пропущены, то можно сохранять положение каретки и читать с последнего положения внутри lock или Semaphore(-Slim)
Цитата: Руслан от 15.12.2022, 15:19Добрый день.
Да я таким путём и пошёл т.к. самый очевидный, просто искал другие подходы решения задачи. Ну так, мало ли вдруг. =)Просто у меня в процессе задача еще усложнилась и пришлось переделывать решение которое должно уметь одновременно отслеживать несколько файлов.
Плюс ко всему прочему потребовалось чтобы в конфиге можно было указать не просто полный путь к файлу, а чтобы маску файла можно было отследить по текущей дате и по регулярному выражению.Дел еще много в общем.
Вот у меня смута в голове, куда писать данные о положении каретки. В файл или реестр? =)
Вот Хачатур говорил в уроках что лучше реестр и он для этого и создавался, но лучше ли если данные могут обновляться там несколько раз секунду.
Добрый день.
Да я таким путём и пошёл т.к. самый очевидный, просто искал другие подходы решения задачи. Ну так, мало ли вдруг. =)
Просто у меня в процессе задача еще усложнилась и пришлось переделывать решение которое должно уметь одновременно отслеживать несколько файлов.
Плюс ко всему прочему потребовалось чтобы в конфиге можно было указать не просто полный путь к файлу, а чтобы маску файла можно было отследить по текущей дате и по регулярному выражению.
Дел еще много в общем.
Вот у меня смута в голове, куда писать данные о положении каретки. В файл или реестр? =)
Вот Хачатур говорил в уроках что лучше реестр и он для этого и создавался, но лучше ли если данные могут обновляться там несколько раз секунду.
Цитата: Adler от 15.12.2022, 18:37Приветствую.
Что-то я не понял, зачем что-то несколько раз в секунду сохранять где-то, а не хранить в памяти программы и сохранять при каких-то событиях или по таймеру?
Приветствую.
Что-то я не понял, зачем что-то несколько раз в секунду сохранять где-то, а не хранить в памяти программы и сохранять при каких-то событиях или по таймеру?
Цитата: Руслан от 15.12.2022, 18:43А что если произойдёт внезапное отключение электричества, или краш системы.
В памяти положение каретки хранить так себе решение. После загрузки всё что прочитали ранее и отправили придется читать заново.
А что если произойдёт внезапное отключение электричества, или краш системы.
В памяти положение каретки хранить так себе решение. После загрузки всё что прочитали ранее и отправили придется читать заново.
Цитата: Vladimir от 17.12.2022, 19:34Насколько знаю, команда tail (по крайней мере в линуксе) показывает обновления, которые произошли в файле с момента отправки команды, а не последнего показанного на предыдущем вызове команды, потому не до конца понятно, для чего вообще сохранять где-то каретку
Если приложение упало из-за краша системы или отключения электричества, поддержке будет немного не до вопроса, почему tail не показывает старые обновления файла, которые, к слову, при краше системы или отключении электричества вряд ли будут обновлены (по крайней мере при использовании watcher-а файлы должны обновляться через ту же систему, где этот watcher применяется)А так в целом данные лучше хранить в файле: учитывая тот момент, что существует политика, которая запрещает использовать ps, не исключено, что по этой же политике нельзя (или нельзя будет) стучаться в реестр
Насколько знаю, команда tail (по крайней мере в линуксе) показывает обновления, которые произошли в файле с момента отправки команды, а не последнего показанного на предыдущем вызове команды, потому не до конца понятно, для чего вообще сохранять где-то каретку
Если приложение упало из-за краша системы или отключения электричества, поддержке будет немного не до вопроса, почему tail не показывает старые обновления файла, которые, к слову, при краше системы или отключении электричества вряд ли будут обновлены (по крайней мере при использовании watcher-а файлы должны обновляться через ту же систему, где этот watcher применяется)
А так в целом данные лучше хранить в файле: учитывая тот момент, что существует политика, которая запрещает использовать ps, не исключено, что по этой же политике нельзя (или нельзя будет) стучаться в реестр