Используйте Logrotate для обрезки файлов журналов после каждой записи или очистки последних ‘n’ записей.

Вопрос или проблема

Я создал файл конфигурации logrotate:

touch /etc/logrotate.d/.test

с конфигурациями:

/home/myUser/test*.log{
    size 0
    hourly
    rotate 0    
    nocreate
    nocompress
    missingok
    nocopytruncate
    ifempty
}

Я хочу иметь возможность очищать файлы после каждой записи (блок файла журнала) или в некоторых файлах журнала очищать последние ‘n’ записей. На самом деле, я хочу продолжать делать:

truncate -s 0 /home/myUser/test*.log

Как есть, nocopytruncate удаляет файлы журналов. Если я помещаю copytruncate, он создает второй журнал для каждого журнала “test*.log.1”, игнорируя rotate 0.
Если я выполняю команды ниже, ничего не происходит, игнорируя size 0.

echo "hello" >> ~/test1.log
cat ~/test1.log
  //вывод: hello

Кажется, это не работает, используя size. Чтобы это работало, мне нужно выполнить:

logrotate -f .test

Я что-то делаю не так?

Возможно ли сделать это, используя logrotate, и каким-то образом скрыть файл конфигурации (как он есть)?

Что касается второй части для очистки последних ‘n’ записей, у меня нет идеи, как я могу сделать это с logrotate.

Вместо использования logrotate.

Я бы просто сделал что-то вроде этого:

ln -s /dev/null /home/myUser/test.log

Это приведет к тому, что все данные журнала будут перенаправлены в устройство null.

Но ведение журнала полезно, и обычно вы не должны просто выбрасывать его. Большинство приложений позволяют вам изменять, сколько они ведут журнал и куда они его отправляют. Я бы использовал эти методы, прежде чем просто выбрасывать данные.

Я не знаю, подойдет ли это для вашего проекта, но… думали ли вы о том, чтобы использовать инструмент rotatelogs из проекта apache httpd?

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

Вы можете прочитать больше здесь:

https://httpd.apache.org/docs/2.4/programs/rotatelogs.html

Ответ или решение

Использование Logrotate для обработки логов может быть несколько сложным, особенно когда цель состоит в том, чтобы очищать логи после каждой записи или удалять последние ‘n’ записей. Давайте рассмотрим, как можно достичь желаемого результата, опираясь на вашу конфигурацию и опыт.

Целевые настройки Logrotate

Вы создали конфигурационный файл Logrotate, однако нужно внести некоторые изменения, чтобы лог файл очищался корректно.

  1. Проблема с настройками:

    • Настройка nocopytruncate предотвращает обрезку файла, что приводит к удалению логов. Использования copytruncate создаст новый лог файл, но это может не подходить для вашего сценария, так как вы хотите, чтобы старые записи были доступны до их обрезки.
  2. Решение:

    • Вместо использования logrotate для полной обрезки файла после каждой записи, можно использовать команду truncate, как вы упомянули. Это делается внешним процессом, который вы можете запускать через cron (например, каждый раз, когда файл достигает определенного размера).
truncate -s 0 /home/myUser/test*.log

Как настроить cron для периодического обрезания логов

Если вы хотите автоматизировать процесс обрезки файла, вы можете использовать cron. Вот пример задания, которое будет делать это каждую минуту.

  1. Редактируйте файл crontab:

    crontab -e
  2. Добавьте следующее задание:

    * * * * * /usr/bin/truncate -s 0 /home/myUser/test*.log

Удаление последних ‘n’ записей

Logrotate, к сожалению, не поддерживает удаление последних ‘n’ записей из файла. Это можно реализовать с помощью скрипта, который будет выполнять эту задачу. Представленный ниже bash-скрипт удалит последние 10 строк из файла.

#!/bin/bash
# Путь к лог-файлу
log_file="/home/myUser/test1.log"
# Количество строк для удаления
num_lines_to_remove=10

# Удаление последних 'n' строк
tmp_file=$(mktemp)
head -n -"$num_lines_to_remove" "$log_file" > "$tmp_file" && mv "$tmp_file" "$log_file"

Сохраните этот скрипт, сделайте его исполняемым (chmod +x имя_скрипта.sh), и добавьте его в crontab для выполнения с заданным интервалом.

Использование Lin для очистки логов

Ваше упоминание о перенаправлении логов в /dev/null — это обработка, которая подходит, если вы не заинтересованы в сохранении данных логов. Создание символьной ссылки на /dev/null является разумным решением для временных логов, но не рекомендуется для постоянного ведения учета.

ln -sf /dev/null /home/myUser/test.log

Альтернативные решения с использованием rotatelogs

Вы также упомянули возможность использования rotatelogs. Это полезный инструмент для организации логов, особенно если вы хотите, чтобы логирование происходило динамически и с учетом объема данных. Для начала, вам необходимо установить Apache или использовать его отдельно, если он уже не установлен:

/usr/local/apache2/bin/rotatelogs /logs/test-log.%Y-%m-%d_%H-%M-%S.log 86400

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

Заключение

Использование Logrotate в качестве метода обрезки и очистки логов после каждой записи или удаления последних ‘n’ записей требует немного дополнительных шагов и настройки. Применение Cron для автоматизации процедуры и использование простых bash-скриптов помогут добиться того, что необходимо. В случае, если требуется дальнейшая помощь или уточнения, не стесняйтесь обращаться к сообществу или искать более специализированные решения в зависимости от ваших нужд.

Оцените материал
Добавить комментарий

Капча загружается...