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

13

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

Урай
источник
используйте logrotate, затемrm -f *.tar.gz.*
Marco Ceppi
1
Есть ли какая-то конкретная причина, по которой вы не хотите вращать журнал или использовать logrotate? Что именно вы хотите, чтобы произошло? Архивировать старый журнал в 1M и начать новый? Начало вашего вопроса не совсем совместимо с концом.
Дэвид Торнли
что значит выскочить ?
чепанг

Ответы:

4

Вы можете написать небольшой скрипт для этого. Просто подключите файл к определенному количеству байтов, используя 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.
jjclarkson
источник
3
Я относительно уверен, что после того, как вы «перезапишите файл», регистрация не возобновится автоматически для нового файла.
Стивен Яздевски
0

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

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

Я бы хотел, чтобы у меня было время сделать это, я всегда хотел что-то подобное.

Стивен Яздевский
источник
0

Вы можете сделать что-то подобное, используя FIFO, что-то вроде файла нулевого размера.

Однако учтите, что если из этого файла ничего не ПРОЧИТАЕТСЯ, тогда процесс системного журнала может быть заблокирован и прекратит запись во ВСЕ ваши файлы журналов. Я не уверен, изменилось ли это поведение в более новых версиях Ubuntu / CentOS.

Один пример здесь

Для другого примера попробуйте что-то вроде этого.

Сделайте свой FIFO:

sudo mkfifo /var/log/everything.fifo

И добавьте это в (r) syslog.conf, затем перезапустите syslog:

*.*     |/var/log/everything.fifo

Затем посмотрите FIFO из одного окна:

cat /var/log/everything.fifo

И в другом окне отправьте некоторые вещи в системный журнал:

logger Test1
logger Test2
logger Test3

Вы должны увидеть строки «Test *» в выводе catвыше.

Эта функция может быть полезна для отладки, особенно если вы не хотите хранить данные дольше. Например, если вы хотите видеть только все, кроме спама на брандмауэре, вы можете сделать что-то вроде этого:

grep -vi "kernel: .* on wan" /var/log/everything.fifo
Стефан Ласевский
источник
0

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

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

Стефан Ласевский
источник
0
 * prune - обрезает верх списка файлов, описанных в
 * файл / etc / default / prune. Предназначен для периодического запуска
 * из cron идея состоит в том, чтобы автоматически сокращать журнал
 * файлы, которые растут вечно. Этот файл содержит список
 * файлы (полный путь) и количество блоков, которые
 * следует сохранить. Чтобы сохранить здравомыслие, чернослив будет
 * обрезать файл после следующей новой строки. Файл
 * / etc / default / prune должен выглядеть примерно так:
 *
 * / usr / adm / aculog 10
 * /usr/adm/leo.log 5
 * / usr / adm / messages 200
 * / usr / adm / sup_log 5
 *
 * Запись в crontab на infoswx для чернослива выглядит так:
 *
 * 0 5 * * * / etc / prune> /usr/adm/prune.log 2> & 1
 *
 * Компилировать с помощью: cc -O -o prune prune.c
 *
 * Следующие определения могут быть скорректированы по вашему вкусу
 * и размер вашего системного блока.
 *
 * Ray Davis infoswx! Bees 25.09.85

https://groups.google.com/group/mod.sources/browse_thread/thread/b2136b3ab7e924e/f785b37c218bb576?hl=en&ie=UTF-8&q=prune+log+file&pli=1

Многие (большинство? All?) Демоны повторно открывают свои файлы журналов, если отправляют сигнал HUP (например, тем же заданием cron, которое запускает удаление)

RedGrittyBrick
источник
0

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

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

run_program | curtail -s 200M myprogram.log

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

Дейв Волавер
источник