use a post initialization script
jenkins支持在启动后立即运行指定脚本(${JENKINS_HOME/init.groovy} 或 ${JENKINS_HOME}/init.groovy.d/*.groovy),脚本可以访问Jenins中的类和所有插件。可以利用这个特性来实现日志配置
1 | import java.util.logging.Level |
use java.util.logging
创建一个logging.properties文件,里面包含日志记录的配置,然后通过增加JVM选项-Djava.util.logging.config.file=<pathTo>/logging.properties
来生效配置
这种方式只支持使用了 java.util.logging 来记录日志的classes,如果某些classes使用了其他日志功能(如 org.apache.commons.logging)则不会生效
1 | handlers=java.util.logging.ConsoleHandler,java.util.logging.FileHandler |
使用linux的logrotate
logrotate是个十分有用的工具,它可以自动对日志进行截断(或轮循)、压缩以及删除旧的日志文件。
Logrotate是基于CRON来运行的,其脚本是/etc/cron.daily/logrotate。
logrotate的配置文件是/etc/logrotate.conf,通常不需要对它进行修改。日志文件的轮循设置在独立的配置文件中,它们放在/etc/logrotate.d/目录下。
/etc/logrotate.d/jenkins文件配置如下:
1 | /var/jenkins_home/logs/jenkins.log { |
值得注意的一个配置是:copytruncate
copytruncate 如果没有这个选项的话,操作方式:是将原log日志文件,移动成类似log.1的旧文件, 然后创建一个新的文件。 如果设置了,操作方式:拷贝原日志文件,并且将其变成大小为0的文件。
区别是如果进程,比如nginx 使用了一个文件写日志,没有copytruncate的话,切割日志时, 把旧日志log->log.1 ,然后创建新日志log。这时候nginx 打开的文件描述符依然时log.1,由没有信号通知nginx 要换日志描述符,所以它会继续向log.1写日志,这样就不符合我们的要求了。 因为我们想切割日志后,nginx 自动会向新的log 文件写日志,而不是旧的log.1文件
解决方法有两个:
1.向上面的nginx 切割日志配置,再postrotate里面写个脚本
postrotate
[ -s /run/nginx.pid ] && kill -USR1 cat /run/nginx.pid
endscript
这样就是发信号给nginx ,让nginx 关闭旧日志文件描述符,重新打开新的日志文件描述,并写入日志
2.使用copytruncate参数,向上面说的,配置了它以后,操作方式是把log 复制一份 成为log.1,然后清空log的内容,使大小为0,那此时log依然时原来的旧log,对进程(nginx)来说,依然打开的是原来的文件描述符,可以继续往里面写日志,而不用发送信号给nginx
copytruncate这种方式操作的时候, 拷贝和清空之间有一个时间差,可能会丢失部分日志数据。
nocopytruncate 备份日志文件不过不截断。