logrotate入门

日志文件对于开发运维是非常有用的,通过日志可以跟踪系统的使用以及排查故障。但为了获取到更多的日志信息,日志文件就变得很大,需要占用更多的磁盘空间。系统运行一段时间后,日志文件就会不可控的增大。抛开磁盘占用,肥大的日志文件本身也会拖慢系统的运行。所以,日志文件要保持在一个可控的范围之内。有效管理日志文件也是运维的一个重要任务。通常做法是需要每天做一次日志的归档。

Log rotation、日志分割、日志滚动、日志轮转等,都说的是定期归档系统的日志,开启一个新的日志记录,删除旧的日志记录。

日志rotate有很多方法,比如:
Apache:/usr/local/apache2/bin/rotatelogs
Framework:Log4j,Logback的RollingFileAppender等。

Linux自身提供了一个非常实用 logrotate 功能,它可以自动对日志进行截断、压缩以及删除旧的日志文件。主流Linux发行版上都默认安装有logrotate包,通过 man logrotate 能查看命令的详细使用方法。需要注意的是logrotate自身不是Demon的,需要借助crond实现。

[b](1)相关文件[/b]
/usr/sbin/logrotate logrotate命令
/etc/cron.daily/logrotate 每天通过这个shell执行logrotate
/etc/logrotate.conf 执行Shell时指定的配置文件
/etc/logrotate.d/ 这个文件夹下放置了各个软件自己的日志滚动配置,比如httpd、yum、mysql

[b](2)配置logrotate.conf[/b]

[color=blue]1)logrotate是日志文件位置定义规则[/color]

单一文件定义
/tmp/output.log {
}

多个文件同时定义
/usr/local/nginx/logs/access.log /usr/local/nginx/logs/error.log {
}

通配符定义
/usr/local/domain1.com/log/*log {
}

[color=blue]2)滚动策略[/color]

1-文件大小
比如,当一个文件达到30k时,开始滚动日志文件

/tmp/output.log {
size 30k
create 0600 root root
}

2-daily/weekly/monthly
比如,每天滚动日志文件

/tmp/output.log {
daily
create 0600 root root
}

[color=blue]3)创建文件[/color]
日志文件被归档后,需要创建新的文件继续记录日志

1-create
create是创建了一个新的文件,但是一般日志文件都会被handler,所以不能新建。

2-copytruncate
将源文件copy之后,清空文件内容。
/tmp/output.log {
daily
copytruncate
}

[color=blue]4)保留文件数[/color]
自动清除旧的文件,保留一定需要的文件
/tmp/output.log {
daily
create 0600 root root
rotate 7
}
rotate是以个数为单位的,maxage是以天数为单位的,如果以天来轮转日志,两者一致。

[color=blue]5)归档文件扩展[/color]

默认是从数字1开始
/tmp/output.log.1
/tmp/output.log.2
/tmp/output.log.3

日期
/tmp/output.log {
daily
create 0600 root root
rotate 7
dateext
}
默认是/tmp/output.log-YYYYMMDD

以下可以设置日期格式为/tmp/output.log_YYYYMMDD
/tmp/output.log {
daily
create 0600 root root
rotate 7
dateext
dateformat _%Y%m%d
}

[color=blue]6)压缩归档[/color]
/tmp/output.log {
daily
create 0600 root root
rotate 7
dateext
compress
}
归档文件为:/tmp/output.log-YYYYMMDD.gz

[color=blue]7)配置文件中执行shell(postrotate、sharedscripts)[/color]
/tmp/output.log {
size 1k
copytruncate
rotate 4
compress
postrotate
/home/rensanning/myscript.sh
endscript
}

对于多个日志文件,在一个配置里,结果是相同的,使用sharedscripts可以避免Shell被执行多次。
logrotate 在执行 postrotate 脚本前先检查日志文件是否需要rotate,需要时只执行一次postrotate 脚本。
/home/demo/public_html/domain1.com/log/*log /home/demo/public_html/domain2.com/log/*log {
rotate 14
daily
compress
sharedscripts
postrotate
/usr/sbin/apachectl graceful > /dev/null
endscript
}

[color=blue]8)日志文件不存在时不报错[/color]

/tmp/output.lo {
size 1k
missingok
}

[b](3)归档状态[/b]
logrotate会保存归档状态信息在文件logrotate.status里,默认路径是:/var/lib/logrotate.status

# cat /var/lib/logrotate.status
logrotate state -- version 2
"/var/log/yum.log" 2018-1-1
"/var/log/httpd/*log" 2014-11-14
"/var/lib/mysql/mysqld.log" 2015-6-8
"/var/log/httpd/error_log" 2016-6-19
"/var/log/httpd/access_log" 2016-6-19
"/var/log/cron" 2018-2-4

左侧引号内是日志文件路径,右侧日期是最新rotate的日期。
查看该文件可以知道某个日志文件的最新状态,如果由于NTP时间同步问题,可以删除问题日志文件那一行重新rotate。

[b](4)执行选项[/b]
默认执行
# /usr/sbin/logrotate /tmp/log/logrotate.conf

主要选项
# /usr/sbin/logrotate -vdf /tmp/log/logrotate.conf
-v 显示logrotate执行过程中的详细信息
-d 不实际执行rotate,用于检查配置是否正确
-f 强制执行,如果发现某个应该被rotate的日志文件没有rotate,可以使用该选项强制rotate

你可能感兴趣的:(Linux)