Ротация логов со сжатием?

Ротация логов со сжатием?

Я запускаю процесс на 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 это будет работать без проблем)

Связанный контент