Linux日志工具logrotate详解


logrotate工具的介绍

 

logrotate是一个linux系统日志的管理工具。可以对单个日志文件或者某个目录下的文件按时间/大小进行切割,压缩操作;指定日志保存数量;还可以在切割之后运行自定义命令。

logrotate是基于crontab运行的,所以这个时间点是由crontab控制的,具体可以查询crontab的配置文件/etc/anacrontab。系统会按照计划的频率运行logrotate,通常是每天。在大多数的Linux发行版本上,计划每天运行的脚本位于 /etc/cron.daily/logrotate。

1、配置文件介绍

Linux系统默认安装logrotate工具,它默认的配置文件在:

主配置文件: /etc/logrotate.conf
目录:/etc/logrotate.d/
logrotate 历史: /var/lib/logrotate.status

 logrotate.conf 是 logrotate 的主配置文件,logrotate.d 是一个目录,该目录里的所有文件都会被主动的读入/etc/logrotate.conf中执行,另外,如果 /etc/logrotate.d/ 里面的文件中没有设定一些细节,则会以/etc/logrotate.conf这个文件的设定来作为默认值。

 logrotate 定义日志信息配置选项:

compress             --> 压缩日志文件的所有非当前版本
daily,weekly,monthly --> 按指定计划轮换日志文件
delaycompress        --> 压缩所有版本,除了当前和下一个最近的
endscript            --> 标记 prerotate 或 postrotate 脚本的结束
errors "emailid"     --> 给指定邮箱发送错误通知
missingok            --> 如果日志文件丢失,不要显示错误
notifempty           --> 如果日志文件为空,则不轮换日志文件
olddir "dir"         --> 指定日志文件的旧版本放在 “dir” 中
postrotate           --> 引入一个在日志被轮换后执行的脚本
prerotate            --> 引入一个在日志被轮换前执行的脚本
rotate 'n'           --> 在轮换方案中包含日志的 n 个版本
sharedscripts        --> 对于整个日志组只运行一次脚本
size='logsize'       --> 在日志大小大于 logsize(例如 100K,4M)时轮换

logrotate 命令格式:

logrotate [OPTION...] <configfile>
-d, --debug :debug模式,测试配置文件是否有错误。
-f, --force :强制转储文件。
-m, --mail=command :压缩日志后,发送日志到指定邮箱。
-s, --state=statefile :使用指定的状态文件。
-v, --verbose :显示转储过程。

配置

让我们为我们自己的示例日志文件 /tmp/sample.log 配置 logrotate.

第一步:在 /etc/logrotate.d/目录中添加一下文件,其中test为文件名称,可以根据服务自定义.

# vim /etc/logrotate.d/test 

# Logrotate file for test
/tmp/sample_output.log {
    missingok
    monthly
    create 0600 ofm ofm
    rotate 1
dateext

}

在上面的配置文件中:

size 1k    - logrotate 仅在文件大小等于(或大于)此大小时运行。

create     - 轮换原始文件并创建具有指定权限、用户和组的新文件。

rotate     - 限制日志文件轮转的数量。因此,这将只保留最近的 4 个轮转的日志文件。

compress   - 这将压缩文件。

dateext    - 这个参数很重要!就是切割后的日志文件以当前日期为格式结尾,如xxx.log-20131216这样,如果注释掉,切割出来是按数字递增,即前面说的 xxx.log-1这种格式.  

第二步:通常,你需要等待一天才能等到 logrotate 由 /etc/cron.daily 执行。除此之外,你可以用下面的命令在命令行中运行:

# /usr/sbin/logrotate -f /etc/logrotate.d/test
# /usr/sbin/logrotate -d -f /etc/logrotate.d/test

想手动强制切割日志,需要加-f参数;不过正式执行前最好通过Debug选项来验证一下(-d参数),这对调试也很重要。

在执行 logrotate 之后查看日志是否被切割.

# /usr/sbin/logrotate -f /etc/logrotate.d/test
# ll /tmp
-rw-------  1 ofm  ofm       0 Aug 12 15:53 sample.log
-rw-------  1 root root 216014 Aug 12 15:53 sample.log.1.gz

这样就能确认 logrotate 成功实现了。

#cat /etc/logrotate.conf
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 的参数,因此不见得每个月一定会执行一次喔.要看文件大小。

小示例:下面一个切割nginx日志的配置

# vim /etc/logrotate.d/nginx
/usr/local/nginx/logs/*.log {
daily
rotate 7
missingok
notifempty
dateext
sharedscripts
postrotate
    if [ -f /usr/local/nginx/logs/nginx.pid ]; then
        kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
    fi
endscript
}

 

参考文档:https://www.cnblogs.com/txlsz/p/13126723.html


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM