运行一段时间以后,系统日志日益庞大(du -sh /var/log),放着不闻不问的话就会爆满;根据业务的不同,对日志的处理方式也不一样,基本分为两种:

  • 需要永久保留的日志->线上保留指定时间的日志&其余的存档备份
  • 无需永久保留的日志->线上保留指定时间的日志

最好的做法:是搭建日志服务器,统一进行管理(看企业的重视程度及业务合规程度)

日志

rsyslog

vim /etc/rsyslog.conf
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat #定义日志格式
为了便于统一管理,建议日志文件都存在默认的/var/log文件夹中

系统日志

/var/log/messages #所有日志级别的常规信息(不含邮件、服务认证、定时任务)
/var/log/mailing #邮件日志
/var/log/secure #服务认证日志
/var/log/cron #定时任务日志
/var/log/spooler #新闻群组日志
/var/log/journal

服务日志

/var/log/httpd #Apache 操作、访问及错误日志
/var/log/nginx #Nginx 操作、访问及错误日志
/var/log/php-fpm #PHP-FPM 操作、访问及错误日志
/var/log/redis #Redis 操作、访问及错误日志
/var/log/rhsm #RHSM 操作、访问及错误日志

方案

存档日志

将需要备份的日志文件转存(转存后会直接删除),然后打包存档,然后转移到专用服务器或者硬盘进行备份

logrotate

logrotate 是一个日志管理程序,用来把旧的日志文件删除(备份),并创建新的日志;这个过程称为“转储
配置文件/etc/logrotate.conf&/etc/logrotate.d/*.conf

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

删除日志

不需要备份的日志,直接采用删除指定时段(如:一个月)前的日志

关键语句

  1. find 路径 -type f -ctime +30 -name "*.log" -exec /bin/rm -rf {} \;

vim auto_delete_logs.sh建议使用 root 用户创建脚本文件:

  1. #!/bin/sh
  2. cd /var/log/
  3. logs_dir="find -type d"
  4. for dir in ${logs_dir}
  5. do
  6. find ${dir} -type f -ctime +30 -name "*.log" -exec /bin/rm -rf {} \;
  7. done

添加可执行权限:chmod +x auto_delete_logs.sh,然后crontab -e添加定时任务(每月 1 号 23:30 执行)

  1. 30 23 1 * * /home/www/auto_delete_logs.sh >/dev/null 2>&1

crontab 定时任务使用详见 Linux 定时执行服务:Crontab