Установить максимальный размер файла журнала - PullRequest
0 голосов
/ 06 мая 2019

В настоящее время я пишу простой регистратор для записи сообщений из моего скрипта bash.Регистратор работает нормально, и я просто пишу дату плюс сообщение в файле журнала.Поскольку размер файла журнала будет увеличиваться, я бы хотел установить предел для регистратора, например, 1000 строк.После достижения 1000 строк, он не удаляет и не полностью очищает файл журнала.Следует обрезать первую строку и заменить ее новой строкой журнала.Таким образом, файл хранит 1000 строк и больше не увеличивается.Последняя строка всегда должна быть вверху файла.Есть ли встроенный метод?Или как я мог решить это?

Ответы [ 2 ]

1 голос
/ 06 мая 2019

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

log() {
    tail -999 logfile > tmp &&
    { cat tmp && printf '%s\n' "$*"; } > logfile
}

log "new message"

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

Обратите внимание, что в отличие от sed -iРешение, приведенное выше не изменит индекс, жесткие ссылки, разрешения или что-либо еще для logfile - это тот же файл, с которого вы начали, только с обновленным содержимым, он не заменяется новым файлом.

1 голос
/ 06 мая 2019

Ваш выбранный пример может быть не лучшим. Как уже отмечалось в комментариях, logrotate - лучший инструмент для сохранения размеров файлов журнала; Более того, строка - не лучшая единица измерения размера. Эти комментаторы оба правы.

Однако я беру ваш вопрос за чистую монету и отвечаю на него.

Вы можете достичь желаемого с помощью встроенных командных оболочек, но гораздо быстрее и проще использовать внешний инструмент, такой как sed. (awk - это еще один вариант, но в нем отсутствует переключатель -i, который в этом случае упрощает вашу жизнь.)

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

maxlines=1000
log_msg='Whatever the log message is'

sed -i -e1i"\\$log_msg" -e$((maxlines))',$d' script.log

делает то, что вы хотите.

  • -i означает изменить данный файл на месте.
  • -e1i"\\$log_msg" означает i nsert $log_msg перед первой ( 1 ) строкой.
  • -e$((maxlines))',$d' означает d выбор каждой строки от номера строки $((maxlines)) до последней ( $ ).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...