Вращение ротации со сжатием?

530
LangeHaare

Я запускаю процесс в Linux (CentOS 7), который выдает большой вывод на стандартный вывод. Отправка всего этого в файл приведет к размеру файла более 1 ТБ. Но, к счастью, результат довольно сжимаемый - он состоит из множества довольно повторяющихся текстов.

Я думаю, могу ли я использовать какую-нибудь программу ротации журналов, подобную описанной здесь: ( Ротация журналов stdout? ), Но где когда журнал больше не актуален, он сжимается (и никогда не удаляется)? Итак, я пишу, скажем, пару ГБ в файл, сжимаю его и продолжаю писать в новый файл?

1
Какая у вас версия Linux, поскольку Linux - это просто ядро, как называется ваш дистрибутив? У многих из них уже есть то, что вам нужно Alex 6 лет назад 0
@ Алекс это CentOS 7 LangeHaare 6 лет назад 0
Вы имеете в виду, как с logrotate? Ignacio Vazquez-Abrams 6 лет назад 0
Я исследовал проблему, с которой вы можете столкнуться. Пожалуйста, посмотрите [* Является ли перенаправление с `>>` эквивалентным `>`, когда целевой файл еще не существует? *] (Https://superuser.com/q/1342489/432690) Kamil Maciorowski 6 лет назад 1

1 ответ на вопрос

5
bcs78

Вы можете использовать logrotate для этого. CentOS 7 использует systemd, поэтому вы можете настроить запланированную задачу 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 без проблем)

`copytruncate` кажется полезным, но я думаю, он будет работать, если перенаправление в файл журнала выполняется с помощью >> >>; только после усечения файла новый контент появляется с самого начала. Перенаправление с `>` сохраняет свое (растущее) смещение, поэтому любые новые данные после усечения файла приводят к тому, что файл увеличивается (с ведущими нулями) до старого размера. Kamil Maciorowski 6 лет назад 1

Похожие вопросы