Как ограничить лог-файл до N строк?

у меня есть ./program, который выводит много сообщений журнала, а также имеет очень ограниченное пространство для хранения на моем VPS:

я хотел бы, чтобы мой лог-файл содержал только последние N строк все время (точнее когда я кончаю ^C моя программа или когда она падает...)

A. I do не хочу следующее:

  1. "перенаправить вывод в файл (log -), а затем используйте tail сохранить только последние N строк."

    Ну лог-файл все равно займет драгоценное место, пока я не запущу tail на нем, что делает его бессмысленным... Я могу настроить cronjob, чтобы делать это периодически, если у меня нет другого выбора, но я хотел бы сначала изучить возможности.

  2. " Use logrotate."

    logrotate кажется, правильное решение проблемы, но это слишком много хлопот, и я хочу что-то проще, предпочтительно то, что я могу сделать с трубами и перенаправлениями.

B. я попробовал следующее:

(заменить ./program С seq 1000000 если для тестирования)

  1. seq 1000000 | tee /dev/fd/2 | tail -n 10 > logfile

    работает прекрасно, когда он завершается сам по себе, но когда я прерываю ^C это я,logfile пусто (в то время как я ожидаю, что он будет содержать последние 10 строк, которые напечатано на экране tee)

  2. mkfifo fifo; tail fifo -n 10 > logfile & seq 1000000 | tee fifo

    работает прекрасно, когда он завершается сам по себе, но когда я прерываю ^C это я,logfile is не пустыми, но также не содержит немного последних записей журнала, которые будут напечатаны на экране:

.

$ tail fifo -n 10 > logfile & seq 1000000 | tee fifo
[1] 2616
1
2
3
⋮
480178
480179
480180
480181
480182
480183
^C
[1]+  Done                    tail fifo -n 10 > logfile
$ cat logfile
479297
479298
479299
479300
479301
479302
479303
479304
479305

здесь вы можете увидеть, что последние записи находятся на 480 тысяч, в то время как последняя запись в logfile это 479,305... смысл я скучаю 878 последние строки! Я думаю, что это связано с буферизацией, но я не уверен.

может ли кто-нибудь показать мне, как это сделать, используя только shell и (желательно стандартные) утилиты Linux? Спасибо!

6
задан Bora M. Alper
04.12.2022 7:40 Количество просмотров материала 3490
Распечатать страницу

1 ответ

простейшим решением для вашего случая, вероятно, является круговой журнал, который имеет фиксированный размер.

Если вы на Linux, вы можете попробовать kernel module emlog

модуль ядра emlog реализует простой драйвер символьного устройства. Драйвер действует как именованный канал, имеющий конечный кольцевой буфер. Размер буфера легко настраивается. По мере записи в буфер большего количества данных самые старые данные отбрасываются. Процесс, считывающий данные из emlog устройство сначала прочитает существующий буфер, а затем увидит новый текст, как он написан, подобно мониторингу файла журнала с помощью "tail-f". (Неблокирующие чтения также поддерживаются, если процесс должен получить текущее содержимое журнала, не блокируя, чтобы ждать новых данных.)

на BSD системах смотрите CLOG(8)

0
отвечен Alex 2022-12-05 15:28

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх