共计 3747 个字符,预计需要花费 10 分钟才能阅读完成。
一、介绍日志切割 logrotate
对于 Linux 系统安全来说,日志文件是极其重要的工具。不知为何,我发现很多运维同学的服务器上都运行着一些诸如每天切分 Nginx 日志之类的 CRON 脚本,大家似乎遗忘了 Logrotate,争相发明自己的轮子,这真是让人沮丧啊!就好比明明身边躺着现成的性感美女,大家却忙着自娱自乐,罪过!
logrotate 程序是一个日志文件管理工具。用于分割日志文件,删除旧的日志文件,并创建新的日志文件,起到 ” 转储 ” 作用。可以节省磁盘空间。例如,你可以设置 logrotate,让 /var/log/logfile 日志文件每 30 天轮循,并删除超过 6 个月的日志。配置完后,logrotate 的运作完全自动化,不必进行任何进一步的人为干预。
二、logrotate 配置使用
1、安装 logrotate
(1)系统版本,我使用的如下
[root@linuxidc ~]# cat /etc/RedHat-release
CentOS Linux release 7.3.1611 (Core)
[root@linuxidc ~]# uname -r
3.10.0-514.26.2.el7.x86_6
(2)默认 centos 系统安装自带 logrotate,直接使用 yum 安装
[root@linuxidc ~]# yum -y install logrotate
(3)软件包说明
[root@linuxidc ~]# rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf #logrotate 自身的配置文件
/etc/logrotate.d #配置切割设置的目录
注:logrotate 的配置文件是 /etc/logrotate.conf,通常不需要对它进行修改。
日志文件的轮循设置在独立的配置文件中,它(们)放在 /etc/logrotate.d/ 目录下。
2、配置使用 logrotate
(1)准备测试日志
创建测试日志 /log-file,然后在其中填入一个 10MB 的随机比特流数据文件
[root@linuxidc ~]# touch /var/log/log-file
[root@linuxidc ~]# head -c 10M < /dev/urandom > /var/log/log-file
(2)配置切割设置
[root@linuxidc ~]# vim /etc/logrotate.d/log-file
[root@linuxidc ~]# vim /etc/logrotate.d/log-file
/var/log/test/log-file {
daily
rotate 15
compress
delaycompress
missingok
notifempty
dateext
sharedscripts
create 644 root root
postrotate
/usr/bin/killall -HUP rsyslogd
endscript
}
(3)配置文件参数说明
配置参数 | 说明 |
monthly | 日志文件将按月轮循。其它可用值为 ’daily’,’weekly’ 或者 ’yearly’。 |
rotate 5 | 一次将存储 5 个归档日志。对于第六个归档,时间最久的归档将被删除。 |
compress | 在轮循任务完成后,已轮循的归档将使用 gzip 进行压缩。 |
delaycompress | 总是与 compress 选项一起用,delaycompress 选项指示 logrotate 不要将最近的归档压缩,压缩将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用。 |
missingok | 在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。 |
notifempty | 如果日志文件为空,轮循不会进行。 |
dateext | 切换后的日志文件会附加上一个短横线和 YYYYMMDD 格式的日期,没有这个配置项会附加一个小数点加一个数字序号 |
sharedscripts | 在所有其它指令完成后,postrotate 和 endscript 里面指定的命令将被执行。在这种情况下,rsyslogd 进程将立即再次读取其配置并继续运行。 |
create 644 root root | 以指定的权限创建全新的日志文件,同时 logrotate 也会重命名原始日志文件。 |
postrotate/endscript | 在所有其它指令完成后,postrotate 和 endscript 里面指定的命令将被执行。在这种情况下,rsyslogd 进程将立即再次读取其配置并继续运行。 |
以上信息来源 “man logrotate” |
(4)运行 logrotate
logrotate 可以在任何时候从命令行手动调用
① 要调用为 /etc/lograte.d/ 下配置的所有日志切割配置
[root@linuxidc ~]# logrotate /etc/logrotate.conf
② 要为某个特定的配置调用 logrotate,执行一次切割任务测试
[root@linuxidc ~]# ll /var/log/log-file*
-rw-r–r– 1 root root 10485760 Jun 19 11:33 /var/log/test/log-file
[root@linuxidc ~]# logrotate -vf /etc/logrotate.d/log-file
[root@linuxidc ~]# ll /var/log/log-file*
-rw-r–r– 1 root root 0 Jun 19 11:33 /var/log/test/log-file
-rw-r–r– 1 root root 10485760 Jun 19 11:22 /var/log/test/log-file-20180619
③ 选项注释
-f:选项来强制 logrotate 轮循日志文件
-v:参数提供了详细的输出
(5)设置 logrotate 定时任务
[root@linuxidc ~]# crontab -e
#auth root
#date 2018-06-19
00 00 * * * /usr/sbin/logrotate -vf /etc/logrotate.d/log-file &>/dev/null
三、使用 logrotate 处理 tomcat catalina.out 日志过大问题
问题描述:一般在部署 Tomcat 后,运行久了,catalina.out 文件会越来越大,对系统的稳定造成了一定的影响。
1、定义 tomcat 的 pid 文件
(1)修改 catalina.sh 文件,定义 Tomcat 的 pid 文件的路径
[root@linuxidc ~]# vim /data/tomca/bin/catalina.sh
# Get standard environment variables
PRGDIR=`dirname “$PRG”`
CATALINA_PID=/var/run/tomcat.pid
(2)重启 Tomcat,且查询 pid
[root@linuxidc ~]# systemctl restart tomcat.service
[root@linuxidc ~]# cat /var/run/tomcat.pid
21924
2、配置切割设置
(1)配置切割
[root@linuxidc ~]# vim /etc/logrotate.d/tomcat_catalina
/data/tomcat/logs/catalina.out {
daily
rotate 15
missingok
notifempty
dateext
compress
delaycompress
sharedscripts
create 644 root root
postrotate
if [-f /var/run/tomcat.pid]; then
kill -USR1 `cat /var/run/tomcat.pid`
fi
endscript
}
(2)USR1 信号解释
USR1 亦通常被用来告知应用程序重载配置文件;例如,向 Apache HTTP 服务器发送一个 USR1 信号将导致以下步骤的发生:停止接受新的连接,等待当前连接停止,重新载入配置文件,重新打开日志文件,重启服务器,从而实现相对平滑的不关机的更改。
在没有执行 kill -USR1 `cat ${pid_path}` 之前,即便已经对文件执行了 mv 命令而改变了文件名称,tomcat 还是会向新命名的文件 ” xxx.out_ 20180619″ 照常写入日志数据的。原因在于:linux 系统中,内核是根据文件描述符来找文件的。
3、测试执行
[root@linuxidc ~]# logrotate -vf /etc/logrotate.d/tomcat_catalina
4、设置 logrotate 定时任务
[root@linuxidc ~]# crontab -e
#auth root
#date 2018-06-19
00 00 * * * /usr/sbin/logrotate -vf /etc/logrotate.d/tomcat_catalina &>/dev/null
: