
Есть ли способ сохранить фиксированный размер файла журнала без ротации его новым пустым файлом и удаления (или архивации) старого файла. Например, если я установлю максимальный размер файла журнала в 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
решение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 был обновлен, но сейчас я в этом не разберусь.