Специальный файл, который хранит только последние n строк

478
Daladim

Есть ли способ создать специальные файлы в Linux, которые сохранят только, скажем, 100 последних написанных строк? У меня есть процесс, заполняющий файл журнала, и я хотел бы регулярно анализировать его 100 последних строк.

Я знаю, что мог бы использовать какой-то вид logrotate, но есть ли способ создать специальный файл, который будет заполняться, пока он не достигнет 100 строк, а затем, добавив строку, удалит самую старую, так что файл будет содержать только 100 строк? (вид линейного FIFO)

большое спасибо

0
`tail` делает это, так что вы можете написать задание cron для заполнения файла в любой интервал обновления, который вы хотите. просто переписать с `хвостом > `. если ваша частота обновления достаточно высока, она будет действовать как буфер FIFO. Frank Thomas 8 лет назад 2
Хотя было бы здорово иметь собственную виртуальную файловую систему, в которую вы можете `cat` получить производное содержимое (например, кольцевой буфер), они не очень популярны. Они называются файловыми системами с лог-структурой. Это было бы идеально для этого сценария. https://en.wikipedia.org/wiki/Log-structured_file_system. А пока я предлагаю вам написать скрипт, который делает хвост -n 100 сам по себе. David Betz 8 лет назад 1
Спасибо, я не знал о таких файловых системах! Идеальным вариантом были бы специальные файлы, которые действуют как такие кольцевые буферы (во избежание необходимости устанавливать и монтировать целую FS, и я думал, что основные дистрибутивы Linux уже поддерживают это). Я определенно буду использовать `tail`, но я счастлив, что кое-что узнал :) Daladim 8 лет назад 0
В общем, есть способ создать файлы, которые должны быть именно такими, как вы хотите: custom FUSE (Файловая система в Userspace). Это не так просто, как вы, вероятно, надеялись, но это возможно. Kamil Maciorowski 8 лет назад 0

3 ответа на вопрос

0
Gombai Sándor

Logs are text(like) files and being that kind, appending new disk blocks to them when it's demanded by new lines is a quick action well supported by any file system.

However, constantly dropping out the first line when a new is coming would mean reorganizing at least some if not all the blocks of the file CONSTANTLY. That would mean big overhead dedicated to logging while one of the most important characteristics we want from logging is that it be lightweight .

File systems are not prepared for this (at least I haven't heard about this type), that's why logrotate/tail/database-backed logging are used where the last records are of importance.

Спасибо за эту подсказку низкого уровня, о которой я не думал :) Daladim 8 лет назад 0
0
Jarmund

Presuming that you have a script that processes only the last 100 lines each time it is run, these lines are best captured with the tail command, as it does pretty much what you want to do. The key here is the -n switch which dictates how many lines it should capture, starting from the end.

You can incoprorate tail -n 100 somefile.log in your script directly, or you can periodically run tail -n 100 somefile.log > onlylast100lines.log to create a file with only the last 100 lines. The latter approach will rewrite the target file every time, so no need to delete it between each run.

Я знал о «хвосте» (и, в конце концов, в конечном итоге я им воспользуюсь), но из любопытства я хотел узнать, есть ли какие-то функции Linux, о которых я не знаю, которые сработают. Спасибо, в любом случае. Daladim 8 лет назад 0
0
Mikkel Bue Tellus

Разрабатывая метод Jarmunds, вы можете создать скрипт bash, например:

while true; do  tail -n 100 somefile.log > onlylast100lines.log sleep 5 done 

это будет анализировать последние 100 строк somefile.log в onlylast100lines.log каждые 5 секунд. Файл будет перезаписываться каждый раз, поэтому всегда будут только последние 100 строк. Это может быть добавлено в ваш скрипт входа в систему или на любой уровень запуска, который вы хотите, чтобы это выполнялось.

Я знал о «хвосте» (и, в конце концов, в конечном итоге я им воспользуюсь), но из любопытства я хотел узнать, есть ли какие-то функции Linux, о которых я не знаю, которые сработают. Спасибо, в любом случае. Daladim 8 лет назад 0

Похожие вопросы