Сохраняйте размер файла журнала фиксированным без logrotate

Сохраняйте размер файла журнала фиксированным без logrotate

Есть ли способ сохранить фиксированный размер файла журнала без ротации его новым пустым файлом и удаления (или архивации) старого файла. Например, если я установлю максимальный размер файла журнала в 1 МБ, после того, как размер файла превысит этот предел, он будет автоматически ограничен, текст будет добавлен в «хвост», а самая старая часть текста будет вытолкнута, чтобы сохранить размер файла 1 МБ.

решение1

Вы можете написать небольшой скрипт bash, чтобы сделать это. Просто отметьте файл до определенного количества байтов, используя tail -cи перезапишите файл.

от man tail:

-c, --bytes=N
              output the last N bytes; alternatively, use +N to  output  bytes
              starting with the Nth of each file

   If  the  first  character of N (the number of bytes or lines) is a `+',
   print beginning with the Nth item from the start of each  file,  other‐
   wise, print the last N items in the file.  N may have a multiplier suf‐
   fix:  b  512,  kB  1000,  K  1024,  MB  1000*1000,  M   1024*1024,   GB
   1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.

решение2

Я уверен, что автор оригинального поста нашел решение спустя 8 лет. Вот еще одно для тех, кто может читать эту ветку...

curtail ограничивает размер вывода программы и сохраняет последние 200 МБ вывода с помощью следующей команды:

run_program | curtail -s 200M myprogram.log

https://github.com/Comcast/Infinite-File-Curtailer

решение3

Единственным решением может быть написание собственной файловой системы пользовательского пространства или участие в уже существующей. Посмотрите на частичный список наФайловая система в пользовательском пространстве

Если у вас нет навыков, чтобы внести свой вклад, предложите рекламу проекта или $$$, или и то, и другое, чтобы его добавили за вас.

Жаль, что у меня нет времени это сделать, я всегда хотел чего-то именно такого.

решение4

Вот мой второй ответ. Он довольно хакерский.

Используйте watch(1) для многократного выполнения tail --bytes=1024(последних 1024 байт файла журнала, спасибо @jjclarkson за этот ответ).

watch --no-title tail --bytes=1024 /var/log/messages >/tmp/messages.watch

А затем просмотрите файл с помощью:

less --raw-control-chars /tmp/messages.watch

Разница между ним watchи циклом while заключается в том, что watchон обновит /tmp/messages.watch только в том случае, если были изменения в /var/log/messages.

while true; do
    tail --bytes=1024 /var/log/messages > /tmp/messages.watch
    sleep 1
done

Ну, я думаю, можно было бы поместить testв цикл while, чтобы tail выполнялся только в том случае, если /var/log/messages был обновлен, но сейчас я в этом не разберусь.

Связанный контент