一, 介绍日志切割 logrotate
对于 Linux 系统安全来说, 日志文件是极其重要的工具. 不知为何, 我发现很多运维同学的服务器上都运行着一些诸如每天切分 Nginx 日志之类的 CRON 脚本, 大家似乎遗忘了 Logrotate, 争相发明自己的轮子, 这真是让人沮丧啊! 就好比明明身边躺着现成的性感美女, 大家却忙着自娱自乐, 罪过!
logrotate 程序是一个日志文件管理工具. 用于分割日志文件, 删除旧的日志文件, 并创建新的日志文件, 起到 "转储" 作用. 可以节省磁盘空间. 例如, 你可以设置 logrotate, 让 / var/log/logfile 日志文件每 30 天轮循, 并删除超过 6 个月的日志. 配置完后, logrotate 的运作完全自动化, 不必进行任何进一步的人为干预.
二, logrotate 配置使用
1, 安装 logrotate
(1)系统版本, 我使用的如下
- [root@along ~]# cat /etc/redhat-release
- CentOS Linux release 7.3.1611 (Core)
- [root@along ~]# uname -r
- 3.10.0-514.26.2.el7.x86_6
(2)默认 centos 系统安装自带 logrotate, 直接使用 yum 安装
[root@along ~]# yum -y install logrotate
(3)软件包说明
- [root@along ~]# 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@along ~]# touch /var/log/log-file
- [root@along ~]# head -c 10M </dev/urandom> /var/log/log-file
(2)配置切割设置
- [root@along ~]# vim /etc/logrotate.d/log-file
- [root@along ~]# 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 进程将立即再次读取其配置并继续运行。 |
以上信息来源 & nbsp;"man logrotate" |
(4)运行 logrotate
logrotate 可以在任何时候从命令行手动调用
要调用为 / etc/lograte.d / 下配置的所有日志切割配置
[root@along ~]# logrotate /etc/logrotate.conf
要为某个特定的配置调用 logrotate, 执行一次切割任务测试
- [root@along ~]# ll /var/log/log-file*
- -rw-r--r-- 1 root root 10485760 Jun 19 11:33 /var/log/test/log-file
- [root@along ~]# logrotate -vf /etc/logrotate.d/log-file
- [root@along ~]# 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@along ~]# 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@along ~]# vim /data/tomca/bin/catalina.sh
- # Get standard environment variables
- PRGDIR=`dirname "$PRG"`
- CATALINA_PID=/var/run/tomcat.pid
(2)重启 Tomcat, 且查询 pid
- [root@along ~]# systemctl restart tomcat.service
- [root@along ~]# cat /var/run/tomcat.pid
- 21924
2, 配置切割设置
(1)配置切割
- [root@along ~]# 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@along ~]# logrotate -vf /etc/logrotate.d/tomcat_catalina
4, 设置 logrotate 定时任务
- [root@along ~]# crontab -e
- #auth root
- #date 2018-06-19
- 00 00 * * */usr/sbin/logrotate -vf /etc/logrotate.d/tomcat_catalina &>/dev/null
来源: https://www.cnblogs.com/along21/p/9198427.html