之前的日志一直使用
nohup <command> 2>&1 &
来处理的,奈何数据量太大,几天没有去看,结果磁盘满了,现在准备使用CentOS自带的logrotate实现日志的管理
一、配置
- 因为是自带的,所以安装的过程就不用考虑了,系统,yum的日志都使用logrotate来管理日志
- 在
/etc/logrotate.d
中编辑一个文件,如:flumevi flume
- 在上面的配置文件中添加配置项
/usr/libra/flume/logs/*.log { copytruncate daily dateext missingok rotate 15 notifempty create }
- 常用配置
命令 解释 compress 通过 gzip 压缩转储以后的日志 nocompress 不需要压缩时,用这个参数 copytruncate 用于还在打开中的日志文件,把当前日志备份并截断,其操作是:先把该日志文件拷贝到新创建的文件中,再把该日志文件清空 nocopytruncate 备份日志文件但是不截断 create[ <mode> <owner> <group>] 转储文件,使用指定的文件模式创建新的日志文件,参数可以省略 nocreate 不建立新的日志文件 delaycompress 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩 nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。 errors address 专储时的错误信息发送到指定的Email 地址 ifempty 即使是空文件也转储,这个是 logrotate 的缺省选项。 notifempty 如果是空文件的话,不转储 mail address 把转储的日志文件发送到指定的E-mail 地址 nomail 转储时不发送日志文件 olddir <directory> 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统 noolddir 转储后的日志文件和当前日志文件放在同一个目录下 prerotate/endscript 在转储以前需要执行的命令,这两个关键字必须单独成行 postrotate/endscript 在转储以后需要执行的命令,这两个关键字必须单独成行 sharedscripts sharedscripts的作用是在所有的日志文件都轮转完毕后统一执行一次脚本。如果没有配置这条指令,那么每个日志文件轮转完毕后都会执行一次脚本。当然了,如果你没有定义prerotate和postrotate,也就不用这个参数了 daily 指定转储周期为每天 weekly 指定转储周期为每周 monthly 指定转储周期为每月 rotate <count> 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份 tabootext [ ] list 让 logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~ size <size> 当日志文件到达指定的大小时就转储,size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem),如 sizek 100k
,sizem 100M
missingok 在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误等
二、运行
- 默认会在指定的时间自动执行,但是也可以手动执行
- 运行所有的logrotate:
# logrotate /etc/logrotate.conf
- 运行某个logrotate:
# logrotate /etc/logrotate.d/<logrotate-config-file>
- 强制运行rotate: 不管文件有没有达到默认的1M
# logrotate -f /etc/logrotate.d/<logrotate-config-file>
- 运行所有的logrotate:
- 注意事项
- 系统默认使用cron执行logrotate,加载默认配置文件/etc/logrotate.conf,默认情况下每周转储,保留4份历史日志
- 手动执行logrotate配置文件不会加载配置文件/etc/logrotate.conf,默认转储大于1M的日志,且不保留历史日志,所以最好在自己的配置文件(
/etc/logrotate.d/<your-config>
)中把配置写全,下面的也是一样的 - 手动强制(-f)执行logrotate配置文件也不会加载配置文件/etc/logrotate.conf,默认转储所有日志,且不保留历史日志
- 手动强制执行,一天只能运行一次,多次运行无效
三、问题
- 默认情况下,不是在凌晨去切换的,现在需要把切换日志的时间设置在凌晨0点执行
- 把文件
/etc/cron.daily/logrotate
移动到一个新的目录,然后在/etc/crontab
中添加如下代码0 0 * * * root /etc/logrotate.d/flume
- 把文件
四、关于copytruncate
- copytruncate拷贝截断
- 把数据拷贝到新建的文件中(copy)
- 把当前文件清空(truncate)
- 给程序发信号重新打log文件
sharedscripts postrotate /bin/kill -HUP `cat /var/run/<application>d.pid 2> /dev/null` 2> /dev/null || true endscript
- postrotate表示志轮转执行
- sharedscripts表示所有日志共享脚本轮转完后再执行脚本,默认情况每个脚本轮转完都执行
网友评论