我在 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 上运行,不会出现任何问题)