Тримайте фіксований розмір файлу журналу без логрота


13

Чи є спосіб зберегти фіксований розмір файлу журналу, не обертаючи його новим порожнім файлом та не видаляючи (або архівуючи) старий файл. Наприклад, якщо я встановив максимальний розмір файлу журналу до 1 МБ, після збільшення розміру файлу, що перевищує межу, він буде автоматично затиснутий, текст додається на "хвіст", а найстаріша частина тексту вискакується, щоб зберегти розмір файлу 1МБ .


використовуйте логротат, потімrm -f *.tar.gz.*
Marco Ceppi,

1
Чи є якась конкретна причина, чому ви не хочете обертати журнал або використовувати логротат? Що саме ви хочете, щоб це сталося? Заархівуйте старий журнал на 1М та розпочніть новий? Початок Вашого запитання не зовсім сумісний з кінцем.
Девід Торнлі

що означає попід ?
thepang

Відповіді:


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.

3
Я відносно впевнений, що після того, як ви "перезапишете файл", журнал не відновиться автоматично у новому файлі.
Stephen Jazdzewski

0

Вашим єдиним рішенням може бути написання власної файлової системи користувачів або внесок у існуючу. Подивіться на частковий список у Filesystem у Userpace

Якщо у вас немає навичок робити внесок, запропонуйте рекламний проект або $$$ або обидва, щоб додати його для вас.

Я б хотів, щоб у мене був час на це, я завжди хотів щось саме таке.


0

Ви можете зробити щось подібне за допомогою FIFO, який схожий на нульовий байт.

Однак зауважте, що якщо з цього файлу нічого не читається, процес syslog може бути заблокований, і він припинить записувати на ВСІ ваші логіни. Я не впевнений, чи змінилася така поведінка з новішими версіями Ubuntu / CentOS.

Один приклад тут

Для іншого прикладу спробуйте щось подібне.

Зробіть свій FIFO:

sudo mkfifo /var/log/everything.fifo

І додайте це до (r) syslog.conf, після чого перезапустіть syslog:

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

Потім перегляньте FIFO з одного вікна:

cat /var/log/everything.fifo

А в іншому вікні надішліть деякі матеріали в syslog:

logger Test1
logger Test2
logger Test3

Ви повинні побачити рядки "Тест *" у висновку catвище.

Ця функція може бути чудовою для налагодження, особливо якщо ви не хочете зберігати дані довше. Наприклад, якщо ви хочете бачити лише все, крім спаму thefirewall, ви можете зробити щось подібне:

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циклом і час полягає в тому, що watchоновлення /tmp/messages.watch буде оновлено лише в тому випадку, якщо змінилися в / var / log / messages.

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

І добре, я думаю, ви можете поставити testцикл у той час, щоб хвіст виконувався лише в тому випадку, якщо / 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
 *
 * Запис кронати на infoswx для чорносливу виглядає так:
 *
 * 0 5 * * * / etc / prune> /usr/adm/prune.log 2> & 1
 *
 * Компілюйте з: cc -O -o чорнослив prune.c
 *
 * Наступні визначення можуть бути скориговані на ваш смак
 * та розмір системного блоку.
 *
 * Ray Davis infoswx! Bees 25.09.85

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

Багато (більшість? Всіх?) Демонів повторно відкриють свої файли журналів, якщо надішлють сигнал HUP (наприклад, тим самим завданням cron, який виконує чорнослив)


0

Я впевнений, що оригінальний плакат знайшов рішення через 8 років. Ось ще один для інших, хто може прочитати цю тему ...

обмеження обмежує розмір виходу програми і зберігає останні 200MB виводу за допомогою наступної команди:

run_program | згортання -s 200M myprogram.log

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.