带压缩的日志轮换?

Lan*_*are 1 linux compression logging

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

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

bcs*_*s78 5

您可以为此使用logrotate。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
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 旧版本的日志文件默认使用 gzip 压缩。
  • 创建副本后原地截断原始日志文件,而不是移动旧日志文件并可选择创建新日志文件。
  • 将上一个日志文件的压缩推迟到下一个循环周期,这样您将有两个未压缩的日志文件。
  • 日志文件在增长超过 1GB 时进行轮换。
  • 如果日志文件丢失,请继续下一个而不发出错误消息。
  • 不要将旧的日志文件邮寄到任何地址。
  • 日志文件在被删除之前会旋转 30 次,因此您将拥有 30 个旧日志文件。任何比这更旧的内容都将被删除。

创建系统服务。使用以下命令在/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
Run Code Online (Sandbox Code Playgroud)

让我们安排这个任务。使用以下命令在/etc/systemd/system调用中创建第三个文件mylogrotate.timer

[Unit]
Description=Rotate My Log Timer

[Timer]
OnCalendar=*:00:00
Persistent=true

[Install]
WantedBy=timers.target
Run Code Online (Sandbox Code Playgroud)

这将每小时运行一次 logrotate。

一切都已经设置好了。现在启用计划任务。

systemctl enable mylogrotate.timer
systemctl start mylogrotate.timer
Run Code Online (Sandbox Code Playgroud)

当然,以 root 身份执行所有这些操作。

(我在 Ubuntu 上,但我希望这能在 CentOS 上正常工作而没有任何问题)