解决 Jenkins 日志文件体积过大问题

8 min read

我们知道 Jenkins 会默认将自己的运行日志都输出到 jenkins.log 中,尤其是在非容器的部署模式下,常常由于日志输出过多、工作流任务过多,导致磁盘出现膨胀问题,磁盘空间被占满也会导致你的任务流无法稳定运行。我们往往需要去服务器上进行日志的删除,但是这里就会遇到两个痛点:

  1. 第一个痛点,就是产生的日志集中,且没有一个可切割的工具,它会导致磁盘占用率过高,需要有一个方式来进行定时的清理,运维人员不可能频繁的去机器上做日志清理。
  2. 第二个痛点,如果通过 rm 命令删除日志可能会遇到一个问题,就是 Jenkins 本身占用这个进程,我们删除日志文件以后,因为进程依然是在运行状态的,所以它的空间并不会马上释放,需要重启 Jenkins 进程。

这个时候怎么做呢?我推荐你使用一套日志的切割工具 logrotate 来做 Jenkins 的日志切割。logrotate 又是什么呢?它是 Linux 平台下的日志管理工具,用于分割日志,也就是删除旧的日志文件并且创建新的日志文件,可以起到一个日志轮转的作用。

我们配置 logrotate 需要按照配置文件规范来进行操作。假设我这里有一个 jenkins.log 文件,那么我这里列了一个事例来介绍一下 logrotate 的配置文件

/var/log/jenkins/jenkins.log { 

    hourly  //日志切割频率 

    copytruncate //输出的日志拷(copy)一份出来,再清空(trucate)原来的日志

    missingok //包容文件没有找到的错误

    rotate 8 //轮转次数及保留的文件数

    compress //是否通过gzip压缩转储以后ß的日志文件

    delaycompress //延迟压缩

    size 5G //目标文件需要满足大于指定大小(最高优先)

}

在配置文件里面,第一项配置的 hourly,表示切割的频率,按小时来进行切割。第二个配置(copytruncate)就是输出日志拷贝,再清空原有日志,也就是说我会把原来的日志拷贝出来一份,然后再清空这个日志文件,这样的好处就是不会直接删除日志,相当于先做一个备份。

另外一个配置 missingok,可以包容文件找不到的错误,也就是说,如果我们日文件不存在,它也不会因为错误而导致中断。rotate 8 表示保留的文件份数,也就是底下会切割多少份副本做保留。后面的 compress 就是进行 gzip 压缩,我们可以把日志通过压缩的方式减少磁盘的空间占用。

后面的 delaycompress 是延迟压缩,避免 CPU 性能损耗过大可以做到延迟的压缩。size 5G 是另外一条切割的规则,也就是说,我虽然没有到一个小时,但是我的目标文件已经大于 5 个 G,所以我要优先满足这条规则来进行切割。

在配置好配置文件以后,我们就可以在控制台执行 logrotate --force /etc/logrotate.d/jenkins 命令,通常我们可以把logrotate 加入到定时任务里面去执行这条命令,这样的话就可以做到定时的日志轮转了。