现在的位置:首页>空间域名>正文

使用linux自带的logrotate对nginx,mysql日志进行切割压缩

2016年11月22日 ⁄ 共 4658字 暂无评论

网站日志分割功能,部落之前介绍过一次,之前介绍的是网上可以搜索到的方法,比较常见的批处理文件来执行的,这一次的话,也是部落刚刚在网上看到的一个方法,是linux自带的logrotate来实现这个功能的,除此以外,我们还可以对nginx,mysql日志进行切割压缩。

之前的LNMP笔记:Nginx日志切割,不让日志文件占太多磁盘空间用得上的朋友,也可以去看看,个人VPS主机用户,还是有必要去操作一下的。

logrotate简介

日志轮转特别适用于具有固定文件名的日志文件,比如MySQL的出错日志、常规查询日志、慢查询日志等。Linux系统有一个非常好用的根据logratate可以实现自动轮转,本文介绍它的原理和用法。

logrotate是管理日志文件的工具,在CentOS系统中,命令的位置在/usr/sbin/logrotate,常用的操作如:

-d, --debug Don't do anything, just test (implies -v)

-f, --force Force file rotation

注意:带有-d参数,并不会产生新日志.

logrotate一般每天由cron运行一次.标准的配置文件是/etc/logrotate.conf,而/etc/logrotate.d目录也是保存配置文件的位置.

logrotate常见选项:

  1. /-----------------------------------------------   
  2. 选项        |        含义   
  3. -----------------------------------------------   
  4. compress    |    压缩日志文件的所有非当前版本   
  5. copy    |    复制当前的日志文件,忽略create参数   
  6. copytruncate    |    复制当前的日志文件,并置空当前文件   
  7. daily    |    每天轮日志文件i   
  8. dateext    |    轮换的日志后缀为-YYYYMMDD格式   
  9. delaycompress    |    压缩除了当前和最近之外的所有其他版本   
  10. missingok    |    如果日志不存在,不会报错   
  11. notifempty    |    如果日志为空,则不轮换   
  12. rotate n    |    在轮换方案中包含n个版本的日志   
  13. size=logsize    |    如果日志文件大于logsize才轮换   
  14. -----------------------------------------------/  

默认情况下,logrotate部署为每天运行的cronjob,你可以在目录/etc/cron.daily里找到名为logrotate的配置文件。那么它是在每天的上面时候运行的呢?打开文件/etc/crontab就知道了,下面是我机器上的情况:

  1. SHELL=/bin/bash   
  2. PATH=/sbin:/bin:/usr/sbin:/usr/bin   
  3. MAILTO=root   
  4. HOME=/  
  5.         
  6. # run-parts   
  7. 01 * * * * root run-parts /etc/cron.hourly   
  8. 02 4 * * * root run-parts /etc/cron.daily   
  9. 22 4 * * 0 root run-parts /etc/cron.weekly   
  10. 42 4 1 * * root run-parts /etc/cron.monthly  

从上面的配置我们可以知道,/etc/cron.daily是在每天凌晨4:02执行。也就是说,每天4:02分/etc/cron.daily/logrotate将会自动执行,下面是它的内容:

  1. #!/bin/sh   
  2.          
  3. /usr/sbin/logrotate /etc/logrotate.conf   
  4. EXITVALUE=$?   
  5. if [ $EXITVALUE != 0 ]; then   
  6.     /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"  
  7. fi   
  8. exit 0  

从上面我们可以知道,logratate默认的配置文件是/etc/logrotate.conf,下面是它的内容:

  1. # see "man logrotate" for details  
  2. # rotate log files weekly   
  3. weekly  
  4.  
  5. # keep 4 weeks worth of backlogs   
  6. rotate 4  
  7.  
  8. # create new (empty) log files after rotating old ones   
  9. create  
  10.  
  11. # use date as a suffix of the rotated file   
  12. dateext  
  13.  
  14. # uncomment this if you want your log files compressed  
  15. #compress  
  16.  
  17. # RPM packages drop log rotation information into this directory   
  18. include /etc/logrotate.d  
  19.  
  20. # no packages own wtmp and btmp -- we'll rotate them here   
  21. /var/log/wtmp {   
  22.     monthly   
  23.     create 0664 root utmp   
  24.         minsize 1M   
  25.     rotate 1   
  26. }   
  27.   
  28. /var/log/btmp {   
  29.     missingok   
  30.     monthly   
  31.     create 0600 root utmp   
  32.     rotate 1   
  33. }  
  34.  
  35. # system-specific logs may be also be configured here.  

从/etc/logrotate.conf配置可以知道,这个默认的配置文件将读取目录/etc/logrotate.d,所以我们只要把自己写的配置文件放到/etc/logrotate.d目录下即可。

mysql 配置篇

MySQL本省提供了一个rotate的参考配置文件,在mysql安装目录下的support-files目录里,文件名为mysql-log-rotate,内容如下:

  1. # This logname can be set in /etc/my.cnf  
  2. # by setting the variable "err-log"  
  3. # in the [safe_mysqld] section as follows:  
  4. #  
  5. # [safe_mysqld]  
  6. # err-log=/usr/local/mysql/data/mysqld.log  
  7. #  
  8. # If the root user has a password you have to create a  
  9. # /root/.my.cnf configuration file with the following  
  10. # content:  
  11. #  
  12. # [mysqladmin]  
  13. # password = <secret>  
  14. # user= root  
  15. #  
  16. # where "<secret>" is the password.  
  17. #  
  18. # ATTENTION: This /root/.my.cnf should be readable ONLY  
  19. # for root !   
  20.   
  21. /usr/local/mysql/data/mysqld.log {  
  22.         # create 600 mysql mysql   
  23.         notifempty   
  24.         daily   
  25.         rotate 3   
  26.         missingok   
  27.         compress   
  28.     postrotate  
  29.         # just if mysqld is really running   
  30.         if test -x /usr/local/mysql/bin/mysqladmin &&    
  31.            /usr/local/mysql/bin/mysqladmin ping &>/dev/null  
  32.         then   
  33.            /usr/local/mysql/bin/mysqladmin flush-logs   
  34.         fi   
  35.     endscript   
  36. }  

从上面的注释信息可以看到步骤:

1.创建MySQL root密码文件

vi /root/.my.cnf

编辑如下内容:

  1. [mysqladmin]   
  2.  password = <secret>   
  3.  user= root  

注: 是你的root 密码

2.给root 读的权限

chmod 600 /root/.my.cnf

3.把mysql-log-rotate拷贝至/etc/logrotate.d目录下,修改其内容为:

  1. /usr/local/mysql/data/*.log {   
  2.         create 600 mysql mysql   
  3.         notifempty   
  4.         daily   
  5.         rotate 7   
  6.         missingok   
  7.         compress   
  8.         postrotate  
  9.         # http://blog.rekfan.com/?p=449  
  10.         # just if mysqld is really running   
  11.         if test -x /usr/local/mysql/bin/mysqladmin &&    
  12.            /usr/local/mysql/bin/mysqladmin ping &>/dev/null  
  13.         then   
  14.            /usr/local/mysql/bin/mysqladmin flush-logs   
  15.         fi   
  16.     endscript   
  17. }  

4.执行以下命令测试

/usr/sbin/logrotate -f /etc/logrotate.d/mysql-log-rotate

nginx 配置篇

将下面代码 写入 /etc/logrotate.d/nginx

  1. /usr/local/nginx/log/*.log {   
  2.         create 600 www www   
  3.         notifempty   
  4.         daily   
  5.         rotate 7   
  6.         missingok   
  7.         compress   
  8.     postrotate  
  9.         #servic nginx reload   
  10.     endscript   
  11. }  

小结

logrotate对nginx,mysql日志进行切割压缩的教程就到这里了,有时间的站长,可以去自己的站点查看一下您主机里这几个文件有多大,需要的话,可以通过这个工具来切割一下。

给我留言