日志文件包含了关于系统中发生的事件的有用信息, 在排障过程中或者系统性能分析时经常被用到. 对于忙碌的服务器, 日志文件大小会增长极快, 服务器会很快消耗磁盘空间, 这成了个问题. 除此之外, 处理一个单个的庞大日志文件也常常是件十分棘手的事.
logrotate 是个十分有用的工具, 它可以自动对日志进行截断(或轮循), 压缩以及删除旧的日志文件. 例如, 你可以设置 logrotate, 让 / var/log/foo 日志文件每 30 天轮循, 并删除超过 6 个月的日志. 配置完后, logrotate 的运作完全自动化, 不必进行任何进一步的人为干预.
安装:
- yum -y install logrotate crontabs
- /etc/logrotate.d #配置目录
- /etc/logrotate.conf #主配置文件
切割介绍
比如以系统日志 / var/log/message 做切割来简单说明下:
第一次执行完 rotate(轮转)之后, 原本的 messages 会变成 messages.1, 而且会制造一个空的 messages 给系统来储存日志;
第二次执行之后, messages.1 会变成 messages.2, 而 messages 会变成 messages.1, 又造成一个空的 messages 来储存日志!
如果仅设定保留三个日志 (即轮转 3 次) 的话, 那么执行第三次时, 则 messages.3 这个档案就会被删除, 并由后面的较新的保存日志所取代! 也就是会保存最新的几个日志.
日志究竟轮换几次, 这个是根据配置文件中的 dateext 参数来判定的.
看下 logrotate.conf 配置:
- # cat /etc/logrotate.conf
- # 底下的设定是 "logrotate 的默认值" , 如果別的文件设定了其他的值,
- # 就会以其它文件的设定为主
- weekly // 默认每一周执行一次 rotate 轮转工作
- rotate 4 // 保留多少个日志文件(轮转几次). 默认保留四个. 就是指定日志文件删除之前轮转的次数, 0 指没有备份
- create // 自动创建新的日志文件, 新的日志文件具有和原来的文件相同的权限; 因为日志被改名, 因此要创建一个新的来继续存储之前的日志
- dateext // 这个参数很重要! 就是切割后的日志文件以当前日期为格式结尾, 如 xxx.log-20131216 这样, 如果注释掉, 切割出来是按数字递增, 即前面说的 xxx.log-1 这种格式
- compress // 是否通过 gzip 压缩转储以后的日志文件, 如 xxx.log-20131216.gz ; 如果不需要压缩, 注释掉就行
- include /etc/logrotate.d
- # 将 /etc/logrotate.d/ 目录中的所有文件都加载进来
- /var/log/wtmp { // 仅针对 /var/log/wtmp 所设定的参数
- monthly // 每月一次切割, 取代默认的一周
- minsize 1M // 文件大小超过 1M 后才会切割
- create 0664 root utmp // 指定新建的日志文件权限以及所属用户和组
- rotate 1 // 只保留一个日志.
- }
- # 这个 wtmp 可记录用户登录系统及系统重启的时间
- # 因为有 minsize 的参数, 因此不见得每个月一定会执行一次喔. 要看文件大小.
由这个文件的设定可以知道 / etc/logrotate.d 其实就是由 / etc/logrotate.conf 所规划出来的目录, 虽然可以将所有的配置都写入 / etc/logrotate.conf , 但是这样一来这个文件就实在是太复杂了, 尤其是当使用很多的服务在系统上面时, 每个服务都要去修改 / etc/logrotate.conf 的设定也似乎不太合理了. 所以, 如果独立出来一个目录, 那么每个要切割日志的服务, 就可以独自成为一个文件, 并且放置到 /etc/logrotate.d/ 当中.
查看各 log 文件的具体执行情况
[root@fangfull_web1 ~]# cat /var/lib/logrotate.status
参数说明:
compress 通过 gzip 压缩转储以后的日志
nocompress 不做 gzip 压缩处理
copytruncate 用于还在打开中的日志文件, 把当前日志备份并截断; 是先拷贝再清空的方式, 拷贝和清空之间有一个时间差, 可能会丢失部分日志数据.
nocopytruncate 备份日志文件不过不截断
create mode owner group 轮转时指定创建新文件的属性, 如 create 0777 nobody nobody
nocreate 不建立新的日志文件
delaycompress 和 compress 一起使用时, 转储的日志文件到下一次转储时才压缩
nodelaycompress 覆盖 delaycompress 选项, 转储同时压缩.
missingok 如果日志丢失, 不报错继续滚动下一个日志
errors address 专储时的错误信息发送到指定的 Email 地址
ifempty 即使日志文件为空文件也做轮转, 这个是 logrotate 的缺省选项.
notifempty 当日志文件为空时, 不进行轮转
mail address 把转储的日志文件发送到指定的 E-mail 地址
nomail 转储时不发送日志文件
olddir directory 转储后的日志文件放入指定的目录, 必须和当前日志文件在同一个文件系统
noolddir 转储后的日志文件和当前日志文件放在同一个目录下
sharedscripts 运行 postrotate 脚本, 作用是在所有日志都轮转后统一执行一次脚本. 如果没有配置这个, 那么每个日志轮转后都会执行一次脚本
prerotate 在 logrotate 转储之前需要执行的指令, 例如修改文件的属性等动作; 必须独立成行
postrotate 在 logrotate 转储之后需要执行的指令, 例如重新启动 (kill -HUP) 某个服务! 必须独立成行
daily 指定转储周期为每天
weekly 指定转储周期为每周
monthly 指定转储周期为每月
rotate count 指定日志文件删除之前转储的次数, 0 指没有备份, 5 指保留 5 个备份
dateext 使用当期日期作为命名格式
dateformat .%s 配合 dateext 使用, 紧跟在下一行出现, 定义文件切割后的文件名, 必须配合 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
logrotate 默认自动切割生效时间
Logrotate 是基于 CRON 运行的, 所以这个时间是由 CRON 控制的, 具体可以查询 CRON 的配置文件 / etc/anacrontab(老版本的文件是 / etc/crontab)
- cat /etc/anacrontab
- RANDOM_DELAY=45 // 这个是随机的延迟时间, 表示最大 45 分钟
- START_HOURS_RANGE=3-22 // 这个是开始时间
- 1 5 cron.daily nice run-parts /etc/cron.daily
- 7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
第一列数字是 Recurrence period(循环周期)
第二列数字是延迟时间
所以 cron.daily 会在 3:22+(5,45)这个时间段执行,/etc/cron.daily 是个文件夹
如果要自定义切割时间, 需要取消日志自动轮转的设置
mv /etc/anacrontab /etc/anacrontab.bak
结合 crontab 进行自定义的定时轮转操作
0 0 * * */usr/sbin/logrotate -f /etc/logrotate.d/nginxlog>/dev/null 2>&1
日志切割
来源: http://www.bubuko.com/infodetail-2669136.html