Вопрос или проблема
Я создал файл конфигурации 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. Он красиво организует ваши журналы в папке, и вы можете сделать так, чтобы он выполнялся после превышения файла журнала определенного порога.
Вы можете прочитать больше здесь:
Ответ или решение
Использование Logrotate для обработки логов может быть несколько сложным, особенно когда цель состоит в том, чтобы очищать логи после каждой записи или удалять последние ‘n’ записей. Давайте рассмотрим, как можно достичь желаемого результата, опираясь на вашу конфигурацию и опыт.
Целевые настройки Logrotate
Вы создали конфигурационный файл Logrotate, однако нужно внести некоторые изменения, чтобы лог файл очищался корректно.
-
Проблема с настройками:
- Настройка
nocopytruncate
предотвращает обрезку файла, что приводит к удалению логов. Использованияcopytruncate
создаст новый лог файл, но это может не подходить для вашего сценария, так как вы хотите, чтобы старые записи были доступны до их обрезки.
- Настройка
-
Решение:
- Вместо использования
logrotate
для полной обрезки файла после каждой записи, можно использовать командуtruncate
, как вы упомянули. Это делается внешним процессом, который вы можете запускать через cron (например, каждый раз, когда файл достигает определенного размера).
- Вместо использования
truncate -s 0 /home/myUser/test*.log
Как настроить cron для периодического обрезания логов
Если вы хотите автоматизировать процесс обрезки файла, вы можете использовать cron
. Вот пример задания, которое будет делать это каждую минуту.
-
Редактируйте файл crontab:
crontab -e
-
Добавьте следующее задание:
* * * * * /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-скриптов помогут добиться того, что необходимо. В случае, если требуется дальнейшая помощь или уточнения, не стесняйтесь обращаться к сообществу или искать более специализированные решения в зависимости от ваших нужд.