简介

当服务器系统在持续运行时,服务器中部署的各种服务就会产生日志,长此以往服务器中保存的日志文件会越来越大,一个日志文件可能占用数百G的磁盘容量,难以保存,也难以通过查看日志文件进行排错。因此,我们需要对日志进行轮转操作,只需要保留近期的日志信息,对比较久远的日志信息进行压缩并转存到日志服务器,这样做可以让大大降低日志占用的磁盘空间,同时保证我们可以在服务出现问题的时候通过日志信息进行排错和解决
工具
logrotate日志轮转工具可以很轻松的管理系统所产生的日志,它提供自动压缩、删除、分割日志文件的功能,logrotate日志轮状的优点有:
1)可以分隔,如按天,按月,按年分割日志,减小日志大小,降低分析难度
2)可以及时清除在rotate轮转期限外的多于日志数据
3)结合计划任务执行
常用参数

compress:通过gzip对转储以后的日志进行压缩
nocompress:不对日志进行gzip压缩处理
copytruncate:用于处理还在打开中的日志文件,以先拷贝再清空的方式对当前日志进行备份并截断操作;由于拷贝和清空之间有一个时间差,可能会丢失部分日志数据
nocopytruncate:备份日志文件但不进行截断操作
create mode owner group:轮转时指定创建新文件,可指定权限、属主和属组
nocreate:日志轮转后不创建新的日志文件
delaycompress:发生轮转的日志文件到下一次转储时才压缩
nodelaycompress:日志轮转同时进行压缩
missingok:如果日志丢失,忽略此日志不产生报错
errors address:轮转时产生的错误信息发送到指定的Email地址
ifempty:空日志也进行日志轮转
notifempty:空日志不进行轮转
olddir directory:轮转后的日志文件放入指定的目录,指定目录和当前日志文件需要在同一个文件系统
noolddir:轮转后的日志文件和当前日志文件放在同一个目录下
sharedscripts:所有日志都轮转后统一执行postrotate脚本
prerotate:在logrotate轮转之前需要执行的指令,如修改文件的属性
postrotate:在logrotate转储之后需要执行的指令,如重启(kill -HUP)服务
daily:指定轮转周期为每天
weekly:指定轮转周期为每周
monthly:指定轮转周期为每月
rotate count:指定日志文件删除之前轮转的次数,0:没有备份,5:保留5个备份
dateext:使用当期日期作为轮转日志的后缀名
dateformat .%s:配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,只支持 %Y %m %d %s 这四个参数
size(或minsize) log-size:当日志文件到达指定的大小时才轮转,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem).
当日志文件 >= log-size 的时候就轮转
size = 5 或 size 5 (>= 5 个字节就轮转)
size = 100k 或 size 100k
size = 100M 或 size 100M

案例

手动日志轮转

[root@localhost ~]# logrotate -f /etc/logrotate.conf

ssh日志轮转

修改配置文件

[root@localhost ~]# vi /etc/ssh/sshd_config
#指定rsyslog管理日志的设备载体为local1
SyslogFacility local1

设定日志管理

[root@localhost ~]# vi /etc/rsyslog.conf 
#设置SSH服务的所有级别日志通过local1载体设备保存到本地文件夹中
local1.*                        /var/log/ssh.log

配置日志轮转

[root@localhost ~]# vi /etc/logrotate.d/ssh 
/var/log/ssh.log{
    #设定文件不存在也不报错
    missingok
    #设置轮转周期
    weekly
    #日志轮转后新建日志文件
    create
    #设置轮转保留的文件数
    rotate 4
    #设置轮转文件的大小
    size 5M
    #以日期为日志轮转后缀
    #若使用nodateext设置不以日期为后缀,则以1,2,3为文件后缀
    dateext
}

MySQL日志轮转

配置日志轮转

[root@localhost ~]# vi /etc/logrotate.d/mysqld
/var/log/mysql/mysqld.log {
    missingok
    create 600 mysql mysql
    notifempty
    weekly
    rotate 4
    dateext
    postrotate
    #当MySQL服务正在运行时
    if test -x /usr/bin/mysqladmin  && \
       /usr/bin/mysqladmin ping &>/dev/null
    then
        #对日志进行清洗,产生新的binlog日志
       /usr/bin/mysqladmin flush-logs
    fi
    endscript
}

apache日志轮转

配置日志轮转

[root@localhost ~]# vi /etc/logrotate.d/httpd 
/var/log/httpd/*log {
    missingok
    weekly
    #空文件不轮转
    notifempty
    #延迟压缩
    delaycompress
    create
    sharedscripts
    postrotate
        /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
    endscript
}

nginx日志轮转

配置日志轮转

[root@localhost ~]# vi /etc/logrotate.d/nginx 
/usr/local/nginx/logs/access.log{
    daily
    missingok
    rotate 4
    #把旧的文件进行压缩
    compress
    #延迟压缩
    delaycompress
    #空文档不轮转
    notifempty
    create 640 root root
    sharedscripts
    postrotate
        if [ -f /usr/local/nginx/logs/nginx.pid ]; then
            kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
        fi
    endscript
}
/usr/local/nginx/logs/error.log{
    daily
    missingok
    rotate 4
    #把旧的文件进行压缩
    compress
    #延迟压缩
    delaycompress
    #空文档不轮转
    notifempty
    create 640 root root
    sharedscripts
    postrotate
        if [ -f /usr/local/nginx/logs/nginx.pid ]; then
            kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
        fi
    endscript
}