跳过正文
  1. Posts/

logrotate日志切割压缩Nginx Tomcat Redis

·367 字·2 分钟·
Kubehan
作者
Kubehan
云原生知识栈:深度解析容器技术、Kubernetes、Istio、DevOps 实践、Prometheus 监控、Envoy 代理、Golang 开发及云原生架构与微服务趋势的专业博客

logrotate日志切割压缩Nginx Tomcat Redis
#

使用背景情况

运维中日志处理是一个超级常见的任务,可能会经常性的挑取日志内容,比如天级的日志或者是周级,也或者是具体时段的,但是,如果日志两很大时候,日志过滤变得会很繁琐,还会造成空间浪费,资源浪费,特推出日志切割软件进行切割日志,

一、logrotate介绍
#

​ logrotate软件是一个日志管理工具,用于非分隔日志,删除旧的日志文件,并创建新的日志文件,起到“转储作用”,可以为系统节省磁盘空间。一般centos系统已经自带安装好了。
​ logrotate是基于crontab运行的,其脚本是/etc/cron.daily/logtotate,日志轮转是系统自发完成的,实际运行时,logrotate会调用配置文件/etc/logrotate.conf。每日任务执行,可以在/etc/logrotate.d目录里放置自定义好的配置文件,其中文件也会被 logrotate 读取。指明每个日志文件的特定规则。/var/lib/logrotate.status中默认记录logrotate上次轮询日志文件的时间

二、安装logrotate
#

一般系统都默认安装了,如果没有安装用yum安装一下就可以了

yum –y install logrotate

三、使用案例
#

3.1切割Tomcat的Catalina.out
#

cat /etc/logrotate.d/tomcat#第一种
/usr/local/tomcats/*/logs/catalina.out
{
        rotate 7 # 指定日志文件删除之前的转储次数,7表示保留7次备份
        daily    # 指定转储周期为每天
        dateext  # 使用日期为转储文件的后缀
        copytruncate # 用于还在打开中的日志文件,把当前日志备份并截断
        compress  # 通过gzip压缩转储以后的日志
        ifempty   # 即使是空文件也转储,这个是logrotate的缺省选项
        missingok # 如果日志不存在则忽略该警告信息
        postrotate  # postrotate/endscript,在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
        find /usr/local/tomcats/*/logs \( -name "*.txt" -o -name "*.log" \) -mtime +0 -exec rm -rf {} \;
        endscript
}
#第二种
/opt/tomcat/logs/catalina.out { 
    rotate 14  
    daily  
    copytruncate  
    compress  
    notifempty  
    missingok  
    size 10M  
}

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

执行方式

/usr/sbin/logrotate -f /etc/logrotate.d/nginx(配置文件名称)
/usr/sbin/logrotate -d -f /etc/logrotate.d/tomcat (配置文件名称)

3.2 redis 日志备份压缩
#

cat /etc/logrotate.d/redis
{
        rotate 14
        daily
        dateext
        copytruncate
        compress
        ifempty
        missingok
        postrotate
        find /var/log/redis \( -name "*.txt" -o -name "*.log" \) -mtime +0 -exec rm -rf {} \;
        endscript
}

3.3 nginx日志切割
#

vim /etc/logrotate.d/nginx
/var/log/weblog/*.log {//日志路径
    daily  //指定转储周期为每天
    compress  //通过gzip 压缩转储以后的日志
    rotate 7  //保存7天的日志
    missingok  //如果日志文件丢失,不要显示错误
    notifempty  //当日志文件为空时,不进行轮转
    dateext  //使用当期日期作为命名格式,exp: nginx_access.log-20190120
    sharedscripts  //运行postrotate脚本
    postrotate  //执行的指令
            if [ -f /run/nginx.pid ]; then
                    kill -USR1 `cat /run/nginx.pid`
            fi
    endscript  //结束指令
}

3.4 PHP-FPM日志的配置实例
#

vim /etc/logrotate.d/php
/usr/local/php/var/log/*.log {
daily
compress
rotate 7
missingok
notifempty
dateext
sharedscripts
postrotate
    if [ -f /usr/local/php/var/run/php-fpm.pid ]; then
        kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`
    fi
endscript
}

四、参数说明
#

<th style="text-align: center;">
  说明
</th>
<td style="text-align: center;">
  启用压缩,指的是轮替后的旧日志,这里默认用的是gzip压缩的
</td>
<td style="text-align: center;">
  以gzip -9的模式压缩
</td>
<td style="text-align: center;">
  解压日志,默认是gunzip
</td>
<td style="text-align: center;">
  每天轮替选项
</td>
<td style="text-align: center;">
  轮替的日志文件会附加上一个短横线和YYYYMMDD格式的时间戳
</td>
<td style="text-align: center;">
  将以前的日志文件压缩推迟到下一次轮替
</td>
<td style="text-align: center;">
  即使日志文件是空的也轮替
</td>
<td style="text-align: center;">
  将轮替后的文件发送到指定E-mail地址
</td>
<td style="text-align: center;">
  用于还在打开中的日志文件,把当前日志备份并截断,开始轮替
</td>
<td style="text-align: center;">
  向邮件发送轮替文件/轮替后历史文件(默认)
</td>
<td style="text-align: center;">
  一个月轮替一次
</td>
<td style="text-align: center;">
  如果在logrotate.conf中启用了压缩,这里是做不用压缩的参数
</td>
<td style="text-align: center;">
  不发送邮件到任何地址
</td>
<td style="text-align: center;">
  如果日志时空的就不轮替
</td>
<td style="text-align: center;">
  轮替后日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
</td>
<td style="text-align: center;">
  在做完轮替后的命令,两个关键字必须单独成行,使用的操作在2者之间相当于分组“{}”,注意的使用外部指令时要用绝对路径
</td>
<td style="text-align: center;">
  在做轮替前的命令,同上
</td>
<td style="text-align: center;">
  轮替最多保留之前的数据几次,超出的将被删除或邮件接收,设为0则不保存
</td>
<td style="text-align: center;">
  当日志增长到指定大小的时候开始轮替,它不会考虑
</td>
<td style="text-align: center;">
  轮替文件名基于这个数字。 例如,指定0时,原日志文件轮替的备份文件以.0为扩展名,如果指定9,就直接从.9开始跳过0-8 然后再继续向后轮替rotate指定的次数。
</td>
<td style="text-align: center;">
  如果当前的星期几比上次轮替的星期几少,或者过了一个多星期,就会发生轮替通常是在每周的第一天轮替,如果logrotate不是每天运行的,会在第一次有机会时进行轮替。
</td>
<td style="text-align: center;">
  如果当前年份不同于上次轮替的年份,则进行日志轮替
</td>
<td style="text-align: center;">
  在轮替动作之后,postrotate脚本执行之前,立即使用刚轮替的日志文件名创建日志文件。 MODE 指定日志文件的权限(0660之类) OWNER 指定日志文件的属主 GROUP 指定日志文件的属组
</td>
<td style="text-align: center;">
  日志文件可在轮替后使用指定的EXT扩展名。如果使用压缩,通常EXT后还会加上压缩文件的扩展名,通常是.gz。例如想把mylog.foo轮转为mylog.1.foo.gz而不是mylog.foo.1.gz
</td>
参数
compress
compressoptions
uncompresscmd
daily
dateext
delaycompress
ifempty
mail
copytruncate
mailfirst/maillast
monthly
nocompress
nomail
ifempty
olddir directory
postrotate/endscript
prerotate/endscript
rotate count
size size
start count
weekly
yearly
create mode owner group
extension ext