带压缩的日志轮换?

带压缩的日志轮换?

我在 Linux(CentOS 7)上运行一个进程,它在 stdout 上产生大量输出。将其全部发送到一个文件将导致文件大小超过 1 TB。但幸运的是,输出相当可压缩 - 它由大量重复的文本组成。

我的想法是,我可以使用类似这里描述的某种日志轮换程序吗:(标准输出的日志轮换?),但是一旦日志不再是最新的,它就会被压缩(并且永远不会被删除)?所以我最终会将几 GB 的内容写入文件,对其进行压缩,然后继续写入新文件?

答案1

您可以使用日志旋转为此。CentOS 7 使用systemd所以你可以配置一个计划的 logrotate 任务像这样:

  • /etc/systemd/system创建一个名为“logrotate”的配置文件,mylogrotate.config其内容如下:

    /path/to/your/logfile/*.log {
        compress
        copytruncate
        delaycompress
        minsize 1G
        missingok
        nomail
        notifempty
        rotate 30
    }
    

这将告诉 logrotate 执行以下操作:

  • 旧版本的日志文件默认使用 gzip 压缩。
  • 创建副本后截断原始日志文件,而不是移动旧日志文件并选择性地创建新日志文件。
  • 将前一个日志文件的压缩推迟到下一个轮换周期,这样您将拥有两个未压缩的日志文件。
  • 当日志文件大于 1GB 时,就会进行轮换。
  • 如果日志文件丢失,则继续下一个,而不会发出错误消息。
  • 不要将旧日志文件邮寄到任何地址。
  • 日志文件在被删除之前会轮换 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 上运行,不会出现任何问题)

相关内容