
Я запускаю процесс на Linux (CentOS 7), который выводит много информации на stdout. Отправка всего этого в файл приведет к увеличению размера файла более чем на 1 ТБ. Но, к счастью, вывод довольно сжимаем — он состоит из большого количества довольно повторяющегося текста.
Я думаю, можно ли использовать какую-нибудь программу ротации журналов, вроде тех, что описаны здесь: (Ротация логов stdout?), но когда журнал становится неактуальным, он сжимается (и никогда не удаляется)? Так что в итоге я записываю, скажем, пару ГБ в файл, сжимаю его и продолжаю писать в новый файл?
решение1
Вы можете использоватьlogrotateдля этого. CentOS 7 используетсистемдтак что вы можете настроитьзапланированная задача logrotateчто-то вроде этого:
Создайте файл конфигурации logrotate в
/etc/systemd/system
соmylogrotate.config
следующим содержимым:/path/to/your/logfile/*.log { compress copytruncate delaycompress minsize 1G missingok nomail notifempty rotate 30 }
Это заставит logrotate выполнить следующие действия:
- Старые версии файлов журналов по умолчанию сжимаются с помощью gzip.
- Обрезайте исходный файл журнала на месте после создания копии, вместо того чтобы перемещать старый файл журнала и при необходимости создавать новый.
- Отложите сжатие предыдущего файла журнала до следующего цикла ротации, чтобы у вас было два несжатых файла журнала.
- Файлы журналов ротируются, когда их размер превышает 1 Гбайт.
- Если файл журнала отсутствует, перейдите к следующему, не выдавая сообщение об ошибке.
- Не отправляйте старые файлы журналов по какой-либо почте.
- Файлы журнала ротируются 30 раз перед удалением, так что у вас будет 30 старых файлов журнала. Все, что старше, будет удалено.
Создайте службу systemd. Создайте файл, который /etc/systemd/system
вызывается mylogrotate.service
следующим образом:
[Unit]
Description=Rotate My Log
[Service]
Type=oneshot
ExecStart=/usr/sbin/logrotate /etc/systemd/system/mylogrotate.config --state /etc/systemd/system/mylogrotate.state --verbose
Давайте запланируем эту задачу. Создайте третий файл в с /etc/systemd/system
именем mylogrotate.timer
следующим:
[Unit]
Description=Rotate My Log Timer
[Timer]
OnCalendar=*:00:00
Persistent=true
[Install]
WantedBy=timers.target
Это позволит запускать logrotate каждый час.
Все настроено. Теперь включите запланированную задачу.
systemctl enable mylogrotate.timer
systemctl start mylogrotate.timer
Конечно, все это нужно делать под учетной записью root.
(Я использую Ubuntu, но надеюсь, что на CentOS это будет работать без проблем)